题记:前几天面试Java基础给来了个面试题Integer a=100,b=100;System.out.println(a==b);
当时回答是true,后来面试官又来了一个Integer a=200,b=200;System.out.println(a==b);
这个回答的也是true当时面试官笑笑说恭喜你回答错误,当时一愣回来才想起int的范围。

补充:

Java如何查看对象的内存地址?Java是使用hashcode来表示对象的内存地址,两个相同的对象的hashcode是相同的,

我们可以使用System.identityHashCode(传输进去的参数是一个对象)打印对象的hashcode值。

分析:

我们都知道基本类型通过==比较的是他们的值大小,而引用类型比较的是他们的引用地址

这里肯定你也会和我有一样的疑问为什么200的时候是false,100的时候是true,应该Integer包装对象都是比较的应该是内存的地址都应该是false才对啊!
这里请看源码:

当我们给一个Integer赋予一个int类型的时候会调用Integer的静态方法valueOf。

public static Integer valueOf(int i) {

if (i >= IntegerCache.low && i
return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

由源码我们可以看到Integer的范围是“-128~127”,当i在这个范围内是从IntegerCache中直接获取,当超越这个范围才会new 一个新的Integer对象

这里有一点需要解释:

一个Integer 与 int比较,先将Integer转换成int类型,再做值比较,所以返回的是true。

java中还有与Integer类似的是Long,它也有一个缓存,在区间[-128,127]范围内获取缓存的值,而Long与long比较的时候先转换成long类型再做值的比较

Double类型,它没有缓存,但是当Double与double比较的时候会先转换成double类型,再做值的比较。

最新文章

  1. UVA 12300 Smallest Regular Polygon(正多边形)
  2. ios如何获取位置权限
  3. ios开发--一个苹果证书怎么多次使用——导出p12文件
  4. latex 写作
  5. [转] GCC __builtin_expect的作用
  6. jQuery第九章
  7. 初识XMLHttpRequeset
  8. 微信小程序之获取当前位置经纬度以及地图显示
  9. Codeforces Round #446 (Div. 2)
  10. Flutter安装之后cmd运行错误解决
  11. Tomcat 配置文件
  12. Problem D: 类的初体验(IV)
  13. 小程序要求的 TLS 版本必须大于等于 1.2
  14. Using promises
  15. ARM LDR/STR, LDM/STM 指令
  16. SQL知识点脑图(一张图总结SQL)
  17. 【对比分析五】CSS阻塞和JS阻塞
  18. Vsual Studio 高版本打开低版本项目的方法
  19. PHP获取页面执行时间的方法(推荐)
  20. [CH弱省胡策R2]TATT

热门文章

  1. String,StringBuffer,StringBuilder三者的区别
  2. linux常用命令---文件拷贝与传输
  3. package.json中^,~的区别
  4. MySQL(2)— 数据库的基本操作
  5. 洛谷P2765 魔术球问题
  6. WordPress 安全配置
  7. PHP 操作结果集对象方法
  8. JSP学习之请求和响应编码
  9. PreparedStatement实现针对不同表的通用查询操作
  10. 通过link的preload进行内容预加载