分析一下String.valueOf()有很多的重载方法,分析String.valueOf(int i)

public static String valueOf(int i) {
return Integer.toString(i);
}

只要参数是基本数值数据类型,内部都是调用其包装类型的toString()方法,我们这里只看Integer的。
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];//传入的参数数字是几位数,就新建一个长度为几的char[]数组
    getChars(i, size, buf);将所有数字加入到char[]中
    return new String(buf, true);//创建一个String对象
}

final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,99999999, 999999999, Integer.MAX_VALUE };	
	
// Requires positive x
static int stringSize(int x) {
    for (int i=0; ; i++)
        if (x <= sizeTable[i]) // 123 < 999,也就是i=2,返回i+1=3,也就是参数是一个三位数
            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;
    }
}

String(char[] value, boolean share) {
    // assert share : "unshared not supported";
    this.value = value;
}
posted @ 2022-02-26 16:39  dog_IT  阅读(63)  评论(0编辑  收藏  举报