构造方法:
public Integer(int value){
this.value = value;
}
public Integer(String s) throws NumberFormatException {
this.value = parseInt(s,10);
}
IntergerCache:
private static class IntegerCache{
static final int low = -128;
static final int high;
static final Integer cache[];
static{
int h = 127;
String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.IntegerCache.high");
if (integerCacheHighPropValue != null) {
int i = parseInt(integerCacheHighPropValue);
i = math.max(i,127);
h = Math,min(i, Integer.MAX_VALUE - (-low) - 1);
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}
private IntegerCache() {}
}
cache默认保存-128到127之间的整数值,不new新对象,直接返回cache中对应的数值。其中最大中可以通过第八行代码动态赋值。
Integer a = 100;
Integer a2 = 100;
Integer b = 200;
Integer b2 = 200;
Integer c = new Integer(100);
Integer c2 = new Integer(100);
//print True 因为cache保存 -128到127内, 100<127
System.out.println(a == a2);
//print False 因为cache保存 -128到127内, 200 > 127
System.out.println(b == b2);
//print False 因为没有去找常量池,c,c2都是在堆中申请了空间 返回的引用肯定不一样。
System.out.println(c == c2);
toString:
public static String toString(int i) {
//如果是最小值直接返回其字符串因为Integer.MIN_VALUE=-2147483648 ,这样可以节省下面计算时间
if (i == Integer.MIN_VALUE)
return "-2147483648";
//获取整数值的长度10进制
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
//创建对应大小的char数组
char[] buf = new char[size];
//得到整数中的每一个字符
getChars(i, size, buf);
//返回字符串值
return new String(buf, true);
}
整个toString方法言简意赅总结:
1.如果小于最小值不用判断直接返回。
2.获取整数长度,通过stringSize方法获取。
3.根据获取的整数长度创建char数组,并获取每一个字符,然后把char数组转换成String类型。
需要注意如果是负数,数组长度要+1,给负号留空间。
stringSize:
//----------------------------------
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])
//判断x是几位数
return i+1;
}
非常巧妙的判断x是几位数,需要注意的是在判断前就做了检查,如果是负数转正后再传递过来。
getChars:
final static char [] digits = {
'0','1','2','3','4','5',
'6','7','8','9','a','b',
'c','d','e','f','g','h',
'i','j','k','l','m','n',
'o','p','q','r','s','t',
'u','v','w','x','y','z'
}
//--------------------------------------
final static char [] DigitOnes = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
};
//--------------------------------------
final static char [] DigitTens = {
'0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
'1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
'2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
'3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
'4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
'5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
'6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
'7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
'8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
'9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
};
static void getChars(int i, int index, char[] buf) {
int q, r;
int charPos = index;
char sign = 0;
if (i < 0) {
sign = '-';
i = -i;
}
// 当i >= 65536的时候每一次获取两位的char值。
while (i >= 65536) {
q = i / 100;
// really: r = i - (q * 100);
//使用移位操作快速计算出q*100,2^6+2^5+2^2=64+32+4=100
r = i - ((q << 6) + (q << 5) + (q << 2));
i = q;
buf [--charPos] = DigitOnes[r];
buf [--charPos] = DigitTens[r];
}
// 当 i <= 65536的时候每次只获取一位的char值
// assert(i <= 65536, i);
for (;;) {
//q/10,2^19=524288, (double)52429/(1<<19)=0.10000038146972656
q = (i * 52429) >>> (16+3);
// r = i-(q*10) ...
r = i - ((q << 3) + (q << 1));
buf [--charPos] = digits [r];
i = q;
if (i == 0) break;
}
if (sign != 0) {
//如果是负数加上符号位
buf [--charPos] = sign;
}
}
1.在 i >= 65536 的时候每次能够求出2位的char 值。(while循环中)
2.65536的时候每次只获取一位的char值。(for循环中)
3.q = (i * 52429) >>> (16+3);
等价于 q/10
,
r = i - ((q << 3) + (q << 1));
等价于 r = i-(q*10)
,
for循环中每次取到对应的个位,放到指定的char数组位置中。
4.while循环的作用和for相同,只不过while循环一次取出来两个数。
例如 65536,先/100 得出655 然后65536-655*100 = 36
然后将30赋值到数组中,个位赋值个位,十位赋值十位。一次赋值两位之后的 i也缩减了两位。
进制转换:
toHexString:
int转十六进制字符串
toOctalString:
int转八进制字符串
toBinaryStrng:
int转二进制字符串