java Integer的一些方法源码

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));
    }

猜你喜欢

转载自blog.csdn.net/y2052/article/details/82086484