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