Integer inta = 2; //相当于Integer inta = new Integer(2);
Integer intb = 2; //相当于Integer inta = new Integer(2);
System.out.println(inta == intb);//输出将为true
Integer biga = 128; //相当于Integer inta = new Integer(128);
Integer bigb = 128; //相当于Integer inta = new Integer(128);
System.out.println(biga == bigb);//输出将为false;
出现这种结果差别的原因主要是Integer这个类的设计导致的,如java.lang.Integer类的如下源码所示;
static final Integer[] cache = new Integer[-(-128) + 127 + 1];
static {
for (int i=0; i<cache.length; i++)
cache[i] = new Integer[i-128];
}
从上面看来,Integer中将-128到127的Integer对象缓存到了cache数组中;
inta == intb判断时这两个Integer对象实际上都是指向Integer里cache数组中的同一个对象(cache[130]),因此结果为true;
biga == bigb时由于128不再Integer的缓存数组中,因此每次都会重新创建一个新的对象,因而分别指向不同对象的biga和bigb不相等,返回false