黑马程序员技术交流社区
标题: 为什么Integer的100==100 是true,1000 == 1000是false,你知道吗? [打印本页]
作者: Hansion 时间: 2015-12-18 23:55
标题: 为什么Integer的100==100 是true,1000 == 1000是false,你知道吗?
本帖最后由 Hansion 于 2015-12-18 23:59 编辑
我们一起来看看下面的代码,不要往下拉看原理,你先来猜猜下面的答案是什么?- Integer a = 100, b=100;
- System.out.println(a == b); //第一行
-
- Integer c = 1000,d = 1000;
- System.out.println(c == d); //第二行
复制代码
问题:
1.第一行输出语句输出的是 true 还是 false?
2.第二行输出语句输出的是 true 还是 false?
如果你的答案是 ture true ,我告诉你是 true false 你会信吗?
不信的话就打开eclipse 把代码粘进去,运行一次试试看
结果出来后,也许你会疑惑,为什么看着没什么区别,只是“多了个零”结果就不一样呢?
如果你想进步,先不要看下面的解释,试试自己去找答案,思考后的得到的知识才是最深刻的.
如果你等不急,就直接往下看
。
。
。
这是是靠整型数的自动拆装箱实现的,而两者的结果却不相同。
原因在于,在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例。
以下是Integer.valueof()的源代码:
简单地解释这段代码,就是如果传入的int在IntegerCache.low和IntegerCache.high之间,那就尝试看前面的缓存中有没有打过包的相同的值,如果有就直接返回,否则就创建一个Integer实例。IntegerCache.low 默认是-128;IntegerCache.high默认是127.
注:如果要比较两个对象的内容是否相同,尽量不使用== 或者!= 来比较,可以使用equal()来实现。
作者: 王彩虹 时间: 2015-12-19 22:03
来看看{:2_30:}
作者: keaitao0321 时间: 2015-12-19 22:28
厉害,{:2_30:}{:2_30:}
作者: 214652440 时间: 2015-12-19 22:35
超出范围了,Integer是有范围的,在范围内会自动类型转换,超出范围,他会New一个对象,比较的就是地址值了
作者: 1号猿 时间: 2015-12-20 02:20
一句话搞定, byte常量池
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |