今天看微信做了一个选择题,对Integer比较结果有点意外,题目如下:

public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
System.out.println(c == d);
System.out.println(e == f);
System.out.println(c == (a + b));
System.out.println(c.equals(a + b));
System.out.println(g == (a + b));
} //output:
true
false
true
true
true

怎么也想不明白为什么c == d为true,而e == f却为false。然后测试了几个不同的数值,到127时还是true而当值为128时结果就为false了。而128刚好是2^7,因此应该是有个范围的。

然后Google了一下,看到大家的解答才恍然大悟,原来在java中,在我们用Integer a = 数字;来赋值的时候Integer这个类是调用的public static Integer valueOf(int i)这个方法。

而valueOf()函数的源码为:

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

这样可以发现对传入参数i做了一个判断。在-128<=i<=127的时候是直接用的int原始数据类型,而超出了这个范围则是new了一个对象。我们知道"=="符号在比较对象的时候是比较的内存地址,而对于原始数据类型是直接比对的数据值。所以出现了上面比较e,f返回false的结果。

最新文章

  1. Lua 学习笔记(九)协同程序(线程thread)
  2. Xcode6 管理provisioning profile
  3. C#常用控件介绍
  4. 改变TableView中的分割线位置
  5. 【pom.xml 依赖】使用net.sf.json-lib-2.4-jdk15.jar所需要的其他依赖架包 以及其一直在pom.xml报错的问题
  6. 优化Webstorm
  7. [terry笔记]RMAN综合学习之配置
  8. Node.js学习笔记(1)
  9. 分享9款很有创意的HTML5动画
  10. app配置智能硬件的解决方案
  11. 自己写的carousel
  12. 不要怂,就是GAN (生成式对抗网络) (二)
  13. 性能测试开源小工具——http_load介绍
  14. 【前端】vue.js环境配置以及实例运行简明教程
  15. java 整型数组基本排序,冒泡,快速选择,插入,归并
  16. vim YouCompleteMe 遇到的问题及解决
  17. HTTP协议 与 TCP协议 的区别
  18. Java ee第三周作业
  19. python 在window 系统 连接并操作远程 oracle 数据库
  20. Spring---面向切面编程(AOP模块)

热门文章

  1. 【HCNE题型自我考究】
  2. 使用NPOI快速导出导入Excel
  3. JS基础知识-01
  4. java 上溯造型与下塑造型
  5. wnds更新为1.0
  6. c/c++指针传参
  7. C++11中decltype的使用
  8. java线程池技术
  9. 问题:docker pull 用户登陆tricky,Error response from daemon: unauthorized: incorrect username or password
  10. iOS笔记054 - 核心动画