本帖最后由 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()来实现。
|