先看一段代码:
public class test {
public static void main(String[] args) {
Integer i1= 10;
Integer i2= 10;
Integer i3=new Integer(10);
Integer i4=new Integer(10);
System.out.println(i1 == i2); //true
System.out.println(i1 == i3);// false
System.out.println(i1 == i4);// false
System.out.println(i1.equals(i2) );//true
System.out.println(i1.equals(i3) );//ture
System.out.println(i1.equals(i4) );//true
}
}
运行结果:
为什么会是这样呢?这有个图可以很好的解释:
==比较是两个对象的地址,可以从图里看出Integer i1= 10只是在自己的静态元素区建立了一个对象,而 Integer i2= 10同时也指向这里这两者自然相等,Integer i3=new Integer(10),Integer i4=new Integer(10)分别在堆内存中新建了两个不同的对象。自然两者地址不相等
对于equals请看看下面的代码
这是equals的源代码 将传入的obj转化成Integer 进行数值比较 只要数值相等就会返回true
再看下一段代码
public class test {
public static void main(String[] args) {
Integer i1= 1000;
Integer i2= 1000;
Integer i3=new Integer(1000);
Integer i4=new Integer(1000);
System.out.println(i1 == i2); //false
System.out.println(i1 == i3);// false
System.out.println(i1 == i4);// false
System.out.println(i1.equals(i2) );//true
System.out.println(i1.equals(i3) );//ture
System.out.println(i1.equals(i4) );//true
}
}
运行截图:
这里有一个很奇怪的一点为什么这里的i1==i2为fasle呢
查看的下Iteager的员代码 在700多行可以看见
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
有Integer cache[]这样的数组 在元素静态区通过for循环帮你新建了从-127到128 不在这个区间就当于
Integer i1= 1000 和Integer i3=new Integer(1000) 这两者是等价的
类.equals
test t1 =new test();
t1.equals(t1);
源代码:
大家可以想想这里的运行结果是什么。