先看代码:
public class Main {
public static void main(String[] args) {
Integer a1 = 127;
Integer a2 = 127;
System.out.println("a1 == a2:::::"+(a1 == a2));
Integer b1 = 128;
Integer b2 = 128;
System.out.println("b1 == b2:::::"+(b1 == b2));
}
}
运行结果:
仅仅差一个数为什么结果不同呢?
我们知道Integer a1 = 127; 这里与Integer a1 =Integer.valueOf(127);
所以我们看value()方法源码
我们看到这里进行了判断,如果值在某个范围内则去返回cache这个数组中的值,反之创建一个对象。看下图,我们发现两个常量值分别为-128和127。所以当我们输入127时程序就会进入下图。
如果当输入的值超出了-128到127的范围,就会直接创建对象,那么对象之间的==比较可想而知一定返回false。
疑问:源码为什么要这么设计呢?
我们发现这个范围是final类型修饰的,那么说明这个这是在类加载期间就完成的。在以后需要的时候之间指向就可以使用了,省去了创建对象的开支,提高了效率。
同理我们还知道equals()方法。
那么当我们使用equals()方法时会时这样的吗。发现结果正常。
我们看equals()方法的源码:
我们知道实际上Integer包装类与String包装类性质在这里是相同的,所以不做过多阐述,不懂请看java中equals和==的使用区别,里面主要以String为例说明了equals和== 的区别。
总结:
在之后的编写代码时,如果是比较内容或者对象的话使用equals方法,如果比较地址则用==。