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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Hansion 于 2015-12-18 23:59 编辑


我们一起来看看下面的代码,不要往下拉看原理,你先来猜猜下面的答案是什么?
  1.                 Integer a = 100, b=100;
  2.                 System.out.println(a == b);                //第一行
  3.                
  4.                 Integer c = 1000,d = 1000;
  5.                 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()来实现。


4 个回复

倒序浏览
来看看{:2_30:}
回复 使用道具 举报
厉害,{:2_30:}{:2_30:}
回复 使用道具 举报
超出范围了,Integer是有范围的,在范围内会自动类型转换,超出范围,他会New一个对象,比较的就是地址值了
回复 使用道具 举报
一句话搞定, byte常量池
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马