题外话
首先是Java在1.5后引入了自动拆装箱
public static void main(String[]args){
Integer intg=1; //装箱
int i=intg; //拆箱
}
实际上那:
自动装箱都是通过包装类的valueOf()方法来实现的.自动拆箱都是通过包装类对象的xxxValue()来实现的。
Integer intg=Intg.valueOf(1);
int i=intg.intValue();
正题:
public static void main(String[]) aa {
Integer integer1 = 127;
Integer integer2 = 127;
if (integer1 == integer2)
System.out.println("integer1 == integer2");
else
System.out.println("integer1 != integer2");
Integer integer3 = 128;
Integer integer4 = 128;
if (integer3 == integer4)
System.out.println("integer3 == integer4");
else
System.out.println("integer3 != integer4");
}
输出: integer1 == integer2
integer3 != integer4
为什么这样呢
自动拆装箱机制提供了一个缓存机制来节省内存和提高性能,Integer对象通过使用相同的对象引用来比较大小,而这个相同的对象就是缓存;即:
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);
}
自动装箱时,如果数字在-128至127之间时,会直接使用缓存中的对象,而不是重新创建一个对象,否则会重新创建对象,
所以之所以Integer对象可以比较值大小,也是比的对象;
但是在比较两个对象相等时,在上面的范围内可以“==”,超过就得老老实实“equals”
"==":
1.若两者都是引用类型,则比较的是地址
2.若有一方是引用类型一方为基础类型则自动拆箱比较值得大小
“equals”
1基本类型(值类型)之间无法使用equals比较。
2. equals参数为值类型,则参数会进行自动装箱为包装类型,
3. equals参数为包装类型,则先比较是否为同类型,非同类型直接返回false,同类型再比较值。
423

被折叠的 条评论
为什么被折叠?



