A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mafu1993 中级黑马   /  2016-10-14 23:17  /  717 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马