首先看看valueof()的实现
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
所以可以看成:
new Integer(Integer.parseInt(s))
也就是说把
parseInt 的结果进行一次封装,返回值为Integer
另外可以看一下integer和int拆箱
int i = 128;
Integer i2 = 128; //Integer i2 = Integer.valueOf(128);
Integer i3 = new Integer(128);
System.out.println("i == i2: "+(i == i2));//Integer会自动拆箱为int,所以为true
System.out.println("i == i3: "+(i == i3));//Integer会自动拆箱为int,所以为true
System.out.println("i2 == i3: "+(i2 == i3));//new Integer(128) == new Integer(128),所以为false
//对于-128到127之间的数,会进行缓存,Integer i5 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了
Integer i5 = 127;//java在编译的时候,被翻译成-> Integer i5 = Integer.valueOf(127);
Integer i6 = 127;
System.out.println("i5 == i6: "+(i5 == i6));
Integer i52 = 128;
Integer i62 = 128;
System.out.println("i52 == i62: "+(i52 == i62));
Integer ii5 = new Integer(127);
System.out.println("i5 == ii5: "+(i5 == ii5)); //因为对象不一样,所以为false
Integer i7 = new Integer(1);
Integer i8 = new Integer(1);
System.out.println("i7 == i8: "+(i7 == i8)); //因为对象不一样,所以为false