Integer
Integer a = 100, b = 100;
Integer c = 1000,d = 1000;
System.out.println(a == b);//true
System.out.println(c == d);//false
==比较的是两个对象的引用。
a、b、c、d都是新创建的对象,为什么不输出两个false?
参阅Integer.java这个类:
public static Integer valueOf(int i) {
return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
}
/**
* A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing
*/
private static final Integer[] SMALL_VALUES = new Integer[256];
static {
for (int i = -128; i < 128; i++) {
SMALL_VALUES[i + 128] = new Integer(i);
}
}
声明Integer a = 100;
会自动装箱,也就是调用的valueOf()方法把基本数据类型转换成Integer对象。
为优化性能,Integer中把-128-127 使用的频率比较高的小的数字缓存了下来。
当声明的Integer对象的值在-128-127之间的时候,引用的是同一个对象,所以结果是true。
Integer和int
Integer a = new Integer(1000);
int b = 1000;
Integer c = new Integer(10);
Integer d = new Integer(10);
System.out.println(a == b);//true
System.out.println(c == d);//false
先看第二个,既然Integer把-128-127缓存起来,为什么这里不是true?因为这里的Integer是new出来的,并不是用的缓存,所以结果是false。
再看第一个,为什么是true?首先值为1000,可见与Integer缓存无关系。注意b是int类型。当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,转成int类型,所以这里进行比较的是int类型的值。
网友评论