标签: Integer
如果你运行下面的代码:
@Test
public void test() {
Integer a = 1000, b = 1000;
System.out.println(a == b);//1
Integer c = 100, d = 100;
System.out.println(c == d);//2
}
你得到的结果是
false
true
我们对生成的class文件进行反编译得到实际运行的代码
@Test
public void test() {
Integer a = Integer.valueOf(1000);
Integer b = Integer.valueOf(1000);
System.out.println(a == b);
Integer c = Integer.valueOf(100);
Integer d = Integer.valueOf(100);
System.out.println(c == d);
}
java中的数据类型,可分为两类:
- 基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean他们之间的比较,应用双等号(==),比较的是他们的值。
- 列表项复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false
我们查看官方文档的valueOf 方法
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
这个方法通过缓存经常使用的值,有显著的空间和时间的优化。这个方法缓存的范围是-128~127所以而当int的值不在上述范围内,比如1000,每次都会new出一个新的对象,不同对象的引用地址不同,所以第一个的结果是false。
当int的值在-128-127的范围内,会从Integer内部缓存的对象中选取,同一个int值对应同一个对象,所以第二的结果是true。
网友评论