首先明白两点:
- 对于基本数据类型
==
比较的是值,而对于类==
比较的是内存地址 -
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
。