java Integer的一些方法原始碼
阿新 • • 發佈:2018-11-02
Integer
toString()
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(buf, true );
}
final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
99999999, 999999999, Integer.MAX_VALUE };
static int stringSize(int x) {
for (int i=0; ; i++)
if (x <= sizeTable[i])
return i+1 ;
}
static void getChars(int i, int index, char[] buf) {
int q, r;
int charPos = index;
char sign = 0;
if (i < 0) {
sign = '-';
i = -i;
}
// Generate two digits per iteration
while (i >= 65536) {
q = i / 100 ;
// really: r = i - (q * 100);
r = i - ((q << 6) + (q << 5) + (q << 2));
i = q;
buf [--charPos] = DigitOnes[r];
buf [--charPos] = DigitTens[r];
}
// Fall thru to fast mode for smaller numbers
// assert(i <= 65536, i);
for (;;) {
q = (i * 52429) >>> (16+3);
r = i - ((q << 3) + (q << 1)); // r = i-(q*10) ...
buf [--charPos] = digits [r];
i = q;
if (i == 0) break;
}
if (sign != 0) {
buf [--charPos] = sign;
}
}
public static String toString(int i, int radix) {
if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
radix = 10;
/* Use the faster version */
if (radix == 10) {
return toString(i);
}
//32位2進位制 符號位'+'或'-' 故33位
char buf[] = new char[33];
boolean negative = (i < 0);
int charPos = 32;
//i為正數 取相反數
if (!negative) {
i = -i;
}
//將i轉成對應進位制的數 迴圈條件當i可以用1位該進位制數表示時
// 不可 i<=0(死迴圈 在迴圈的最後i將一直為0)
// 若為 i<0 缺少 i=0的情況並且buf[charPos--]預設還有一位,造成String第一位為空,應在迴圈結尾++charPos
while (i <= -radix) {
//final static char[] digits 儲存0-9 和a-z的字元陣列
// 36個字元 故 radix最大值為36常用的將26個字母作為延遲10進位制以上的進位制
buf[charPos--] = digits[-(i % radix)];//注意:目前i是負數 i&radix 也是負數
i = i / radix;
}
buf[charPos] = digits[-i];
if (negative) {
buf[--charPos] = '-';
}
return new String(buf, charPos, (33 - charPos));
}