Integer数据比较(升级篇)

losetowin 发布于:2017-2-20 23:54 分类:Java  有 1178 人浏览,获得评论 0 条 标签: Integer 装箱拆箱 

本文地址:http://www.dutycode.com/integer_shujubijiao_zhuangxiang_chaixiang.html
除非注明,文章均为 www.dutycode.com 原创,欢迎转载!转载请注明本文地址,谢谢。

之前有写过一篇关于Integer的文章《Integer的数据比较》(http://mp.weixin.qq.com/s?__biz=MzA3NjE5NzE4Nw==&mid=402194451&idx=1&sn=3d8db79ae561f08cba5cb01df96e3bd8#rd)这次再聊一下关于Integer的数据比较,增加一点新的内容。具体还是以例子作为开始。

下面的程序,你觉着输出结果会是什么?

Integer a = new Integer(10);
Integer
b = new Integer(10);
Integer
c = 10;
int d = 10;
System.
out.println("a==b?" + (a == b));
System.
out.println("a==c?" + (a == c));
System.
out.println("a==d?" + (a == d));
System.
out.println("c==d?" + (c == d));

输出结果如下:

a==b?false
a==c?false
a==d?true
c==d?true

看到结果有没有和自己心里想的有点出入呢?

我们解释下:

a==b为false这个不难理解,a和b分别是new出来的新对象,内存地址肯定不同,那么a==b为false也就可以理解。这个在我的上篇文章有提到过。

a==c为false,这个同上的解释, a为new出来的对象,也就意味着是一个新的内存地址。 c虽然不是new出来的,但也肯定不会和a的内存地址一样。(实际上c的内存地址是固定的,这个后面会再讲到)

a==d为true,这个如果按照上面的两个解释,那是否应该是false呢,毕竟a是new出来的一个新对象,内存地址肯定和d的不一样啊。而且本身==比较的是内存地址是否相同,那么这里是否是程序本身出错了呢?

这里涉及到了基本数据类型的装箱和拆箱,在比较a==d的时候,实际上a已经完成了一次拆箱操作。Integer的拆箱操作实际上是调用了Integer的intValue方法。看下intValue方法的源码也就可以理解,实际上a和d的比较实际上为两个int数据的比较,也就是10和10的比较,那么自然为true。

c==d为true,解释同上。

如果我们再添加以下一段比较呢? 

Integer aa = 1000;
Integer
bb = 1000;
System.
out.println("aa==bb?" + (aa == bb));
Integer
cc = 10;
Integer
dd = 10;
System.
out.println("cc==dd?" + (cc == dd));

按照上面的解释,这里的输出结果应该是什么呢?

是true和true吗?

实际上并不是,运行之后得到的结果如下: 

aa==bb?false
cc==dd?true

这里同样涉及到了装箱和拆箱的概念,aa和bb, cc和dd的赋值操作,全都是装箱操作。Integer的装箱操作实际上执行的是valueOf方法。我们看下valueOf方法的源代码

    public static Integer valueOf(int i) {
       
if (i >= IntegerCache.low && i <= IntegerCache.high)
           
return IntegerCache.cache[i + (-IntegerCache.low)];
       
return new Integer(i);
    }
 

上述代码中的low和high分别为-128和127(默认值,可自己指定),通过看源代码我们发现,当数据在-128到127之间的时候实际上是走了缓存的数据(Integer数据缓存),不在这个范围内的数据,则是new一个新的对象。也就可以解释,为什么aa==bb是false了。

回到最开始提到的:实际上c的内存地址是固定的。原因也是上面所讲的,c的赋值过程是个装箱的过程,并且c的值为10,正好在-128到127之间,所以,无论你如何赋值,c的内存地址始终指向缓存中的地址。 


版权所有:《攀爬蜗牛》 => 《Integer数据比较(升级篇)
本文地址:https://www.dutycode.com/integer_shujubijiao_zhuangxiang_chaixiang.html
除非注明,文章均为 《攀爬蜗牛》 原创,欢迎转载!转载请注明本文地址,谢谢。