黑马程序员技术交流社区
标题:
Integer封装类的笑面试题
[打印本页]
作者:
mafu1993
时间:
2016-10-14 23:17
标题:
Integer封装类的笑面试题
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。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2