public static void main(String[] args) {
Integer i1 = 127;
Integer i2 = 127;
System.out.println(i1==i1);
System.out.println(i1.equals(i2));
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3==i4);
System.out.println(i3.equals(i4));
}
结果是ture true false true
那么问题是为什么第三个是false;
首先“==‘比较的是地址值,equals这个方法是重写了object类中的方法,在Intege类中是被重写的,这里比较的是对象的值.(可以看源码)
其次直接赋值的话是调用了Integer封装类的valueOf()这个方法,通过原代码,我们可以看到,这个方法针对-128到127之间做了一个数据缓冲池,也就是说在这个范围内的值都来自一个地方,这个理解跟常量池很像。如果超出这个范围的话,就会return new Integer(i),显然i3 跟 i4的赋值是重新开辟了空间所以地址值是不一样的。所以就输出的结果就是false。 |
|