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