Integer ==问题
首先看一下几个例子:
public class TestInteger { public static void main(String[] args) { Integer a=100; Integer b=100; Integer a1=1000; Integer b1=1000; Integer a0=new Integer(100); Integer b0= new Integer(100); System.out.println(a==b); System.out.println(a1==b1); System.out.println(a0==b0); System.out.println(a.equals(b)); System.out.println(a1.equals(b1)); System.out.println(a0.equals(b0)); } }
运行结果:
true false false
true true true
当我们声明类似Integer a = 100;
的时候,它实际上在内部做的是:
Integer i = Integer.valueOf(100);
valueOf() 方法,我们可以看到
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i
return IntegerCache.cache\[i + (-IntegerCache.low)\];
return new Integer(i);
}
如果值的范围在 - 128 到 127 之间,它就从高速缓存返回实例。
所以…Integer a = 100, b= 100;
指向了同一个对象。
如果两个引用指向同一个对象,用 == 表示它们是相等的。如果两个引用指向不同的对象,用 == 表示它们是不相等的,即使它们的内容相同。
Integer a0=new Integer(100);
Integer中不是有范围是:-128-127
的缓存吗?为什么是false?
先看看Integer的构造方法:它其实并没有用到缓存
。那么缓存是在哪里用的?答案在valueOf
方法中。
我们要养成良好编码习惯,尽量少用==判断两个Integer类型数据是否相等,只有在上述特殊的场景下才相等。而应该改成使用equals
方法判断