Converting ints to Strings

- 103 - easily create another method, similar to magnitude , that returns the number of digits in the value. You can put in a comma every three digits as the number is being written or apply whatever internationalized format is required. This saves you having to write out the number first in a temporary object and then add formatting to it. For example, if you are using integers to fake fixed- place floating-point numbers, you can insert a point at the correct position without resorting to temporary objects.

5.3.2 Converting ints to Strings

While the previous append version is suitable to use for int s by overloading, it is much more efficient to create another version specifically for int s. This is because int arithmetic is optimal and considerably faster than the long arithmetic being used. Although earlier versions of the JDK before JDK 1.1.6 used an inefficient conversion procedure for int s, from 1.1.6 onward Sun targeted the conversion for radix 10 integers only and speeded it up by an order of magnitude. To better this already optimized performance, you need every optimization available. There are three changes you can make to the long conversion algorithm already presented. First, you can change everything to use int s. This gives a significant speedup more than a third faster than the long conversion. Second, you can inline the magnitude method. And finally, you can unroll the loop that handles the digit-by-digit conversion. In this case, the loop can be completely unrolled since there are at most 10 digits in an int . The resulting method is a little long-winded: public static void appendStringBuffer s, int i { if i 0 { if i == Integer.MIN_VALUE { cannot make this positive due to integer overflow s.append-2147483648; return this; } s.append-; i = -i; } int mag; int c; if i 10 one digit s.appendcharForDigit[i]; else if i 100 two digits s.appendcharForDigit[i10] .appendcharForDigit[i10]; else if i 1000 three digits s.appendcharForDigit[i100] .appendcharForDigit[c=i10010] .appendcharForDigit[c10]; else if i 10000 four digits s.appendcharForDigit[i1000] .appendcharForDigit[c=i1000100] .appendcharForDigit[c=10010] .appendcharForDigit[c10]; else if i 100000 five digits s.appendcharForDigit[i10000] .appendcharForDigit[c=i100001000] .appendcharForDigit[c=1000100] .appendcharForDigit[c=10010] - 104 - .appendcharForDigit[c10]; else if i 1000000 six digits ... Im sure you get the idea else if i 10000000 seven digits ... so just keep doing the same, but more else if i 100000000 eight digits ... because my editor doesnt like wasting all this space else if i 1000000000 nine digits ... on unnecessary repetitions else { ten digits s.appendcharForDigit[i1000000000]; s.appendcharForDigit[c=i1000000000100000000]; s.appendcharForDigit[c=10000000010000000]; s.appendcharForDigit[c=100000001000000]; s.appendcharForDigit[c=1000000100000]; s.appendcharForDigit[c=10000010000]; s.appendcharForDigit[c=100001000]; s.appendcharForDigit[c=1000100]; s.appendcharForDigit[c=10010]; s.appendcharForDigit[c10]; } } If you compare this implementation to executing StringBuffer.appendint , the algorithm listed here runs in less time for all except the latest VM, and creates two fewer objects [3] see Table 5-2 . This is faster than the JDK optimized version, has a smaller impact on garbage creation, and has all the other advantages previously listed for the long conversion i.e., it is easily generalized for other radix values, digits are iterated in order so you can write to a stream, and it is easier to alter for formatting without using temporary objects. Note that the long conversion method can also be improved using two of the three techniques we used for the int conversion method: inlining the magnitude method and unrolling the loop. [3] If the StringBuffer.appendint used the algorithm shown here, it would be faster for all JDK versions measured in this chapter, since the characters could be added directly to the char buffer without going through the StringBuffer.appendchar method. Table 5-2, Time Taken to Append an int to a StringBuffer VM 1.2 1.3 HotSpot 1.0 1.1.6 JDK int conversion 100 61 89 148 Optimized int conversion 84 60 81 111

5.3.3 Converting bytes, shorts, chars, and booleans to Strings