< p >
integer.toString()
的无参调用只是调用静态方法
Integer.toString(int i)
(使用整数变量自己的原始值),其实现如下:
public static String toString(int i) {
if (i == Integer.MIN_VALUE)
return "-2147483648";
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(0, size, buf);
}
首先,它会检查它的值是否等于最小可能整数,如果相等,则返回该值。如果不是,则使用Integer的stringSize()方法检查所需的String大小,并使用其作为字符数组的大小。下面是stringSize()的实现;
static int stringSize(int x) {
for (int i=0; ; i++)
if (x <= sizeTable[i])
return i+1;
}
一旦有了正确大小的char[]
,它就会使用下面实现的getChars()
方法来填充该数组;
static void getChars(int i, int index, char[] buf) {
int q, r;
int charPos = index;
char sign = 0;
if (i < 0) {
sign = '-';
i = -i;
}
while (i >= 65536) {
q = i / 100;
r = i - ((q << 6) + (q << 5) + (q << 2));
i = q;
buf [--charPos] = DigitOnes[r];
buf [--charPos] = DigitTens[r];
}
for (;;) {
q = (i * 52429) >>> (16+3);
r = i - ((q << 3) + (q << 1));
buf [--charPos] = digits [r];
i = q;
if (i == 0) break;
}
if (sign != 0) {
buf [--charPos] = sign;
}
}
解释每个步骤对于一个stackoverflow答案来说需要太长时间。然而,最相关的部分(正如评论中指出的)是
getChars()
方法,除了复杂的位移操作之外,它本质上是通过排除法找到每个字符的过程。恐怕我不能在不超出我的理解范围的情况下提供比这更详细的解释。
String.valueOf(this);
- Suresh Atta