Integer初始化
1.初始化Integer的时候,可以直接用一个int值赋值
Integer n1 = 11;
Integer n1 = Integer.valueOf(11);
2.当然也可以使用new来创建Integer对象
Integer n2 = new Integer(11);
Integer对象之间的比较
==运算符
Integer n1 = new Integer(11);
Integer n2 = new Integer(11);
Integer n3 = 11;
Integer n4 = 11;
Integer n5 = 200;
Integer n6 = 200;
System.out.println(n1 == n2); //false,两个new的对象
System.out.println(n1 == n3); //false n1在堆中,n3指向IntegerCache缓存(方法区中)
System.out.println(n3 == n4); //true 都指向缓存中同一个对象
System.out.println(n5 == n6); //false 超出缓存范围,分别是两个new出来的对象
产生上面代码执行结果的原因就是由于IntegerCache的存在,使用第一种方法初始化的对象,如果值的范围在-128~127之间,则相同的值会被包装的同一对象中。 而用new产生的对象肯定不会在同一内存区域。
如果使用==运算符进行比较的话,由于检测的是对象是否指向同一个内存区域,由于初始化时的不确定性,比较的结果也可能不是我们想要的
equals
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Integer类重写了object的equals方法,调用时实际比较的是两个对象的值,和对象存储在哪里没有关系。
所以为了保持对象之间比较结果的一致性,同时我们进行比较的初衷应该也是比较它们之间的值,所以使用equals方法。
但是,如果有null值情况,直接使用equals方法,会导出空指针异常,这时候我们可以使用String.valueOf()对Integer值进行转化,然后再使用equals进行对比