首先明白两点:
对于基本数据类型 == 比较的是值,而对于类==比较的是内存地址
equals由类自己实现,默认情况下比较的是内存地址
java在1.5加入了自动装箱和拆箱
考虑以下一个例子:
Integer a = 127;
Integer b = 128;
第一眼看上去好像没什么区别,但其实内含玄机;
首先这里会自动装箱,(i.e. 调用Integer.valueOf()方法)
我们看下valueOf方法
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
这段代码说明,如果i的值在-128~127之间,会直接返回IntegerCache.cache缓存中的数据,而不是new一个新的Integer。
这里IntegerCache是静态内部类,所以只要是-128~127之间的返回的值的内存地址都是一样的。这一点很重要。
现在我们来举几个例子
Integer a = 127;
Integer b = 127;
System.out.println(a == b); //true,这里a,b,是同一个内存地址
Integer c = 128;
Integer d = 128;
System.out.println(c == d); //false,因为c , d都是new的
同理Long,Byte等都是这样的原理
结论:
java内部回把Integer,Long等-128~127的值存储在常量池中,这些值内存地址相同
Integer,Long等比较-128~127的值时 == 和equals都可以用于比较,否则一定要使用equals。
网友评论