Integer a=13;
Integer b=13;
Integer c=130;
Integer d=130;
System.out.print(a==b);
System.out.print(c==d);
结果却是:true,false 请问各位大侠是咋回事?
这是java语言优越之处!对于这些常用操作的数字-128--127之间的整数放在一个共享池中的!所有就是同一个对象!之外的数字就会创建一个对象呀!比较时用equals方法
答案解析:
1.== 比较的是对象的引用
当且仅当比较的两个引用指向同一对象才返回true 。
2.Integer i = XXX
源码如下:
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset];
}
看看Integer 的源代码就知道了,其实就是Integer 把-128-127 之间的每个值都建立了一个对应的Integer 对象,类似一个缓存。由于Integer 是不可变类,因此这些缓存的Integer 对象可以安全的重复使用。
Integer i = XXX ,就是Integer i = Interger.valueOf(XXX), 首先判断XXX 是否在-128-127 之间,如果是直接return 已经存在的对象,否则就只能new 一个了。
==除了用来比较两个基本数据类型的变量值是否相同外,它还用来判断两个对象变量名称是否指向同一个对象。你的例子里面的用法是属于后者。
J2SE5.0里面增加了基本数据类型的自动装箱和拆箱功能。
[code="java"]
Integer a = 13;
Integer b = 13;
Integer c = 130;
Integer d = 130;
[/code]
这个时候13和130都会被自动装箱为Integer对象。在自动装箱时,对于值在-128到127之间的整数,他们被装箱为Integer对象后,会在内存中被重用,即在这个范围内的,相同的值指向的对象是同一个,所有a和b指向的是同一个对象,所以a==b为true;而超出-128到127的范围的整数,被装箱后的Integer对象并不会被重用,即相当于每次装箱都会新建一个Integer对象,即c和d指向的是两个不同的Integer对象,所以c==d时,结果分为false。