首页 > 分享 > 判断两个Integer是否相等,使用==会产生的问题分析

判断两个Integer是否相等,使用==会产生的问题分析

最新推荐文章于 2024-11-12 14:58:04 发布

一朵风中摇曳的水仙花 于 2020-09-02 10:47:27 发布

Integer a = 128;

Integer b = 128;

System.out.print(a==b);

Integer c = 127;

Integer d = 127;

System.out.print(c==d);

==对于非基本类型来说,是判断两个引用是否指向同一个对象,或者说指向的地址是不是同一个地址。

那为什么数字是128的时候返回false,而数字是127的时候返回ture呢?
这种行为差异的原因是JVM维护Integer范围为-128到127 的对象的缓存。
因此,数字为128的时候(超出了127的范围),会创建新的对象。而数字为127的时候,返回的是同一个指向同一个对象的引用。

上面说到缓存口说无凭,来看源码:

public static Integer valueOf(inti) {

if(i >= -128 &&i <=IntegerCache.high)

return IntegerCache.cache[i + 128];

else

return new Integer(i);

}

Integer c = new Integer(127);

Integer d = Integer.valueOf(127);

System.out.print(c==d);

这又是怎么回事呢?
其实咱们的 integer a = 127 等价于 Integer.valueOf(127)
这两种写法都是会去拿缓存的里对象的。
而new 的话,都是会直接创建对象的。
所以c是一个直接创建的对象,而d是从缓存里拿的对象,c和d指向的地址不相同,肯定==就会返回false了。

自动装箱拆箱机制:
如果在比较的过程中有对某个包装类型进行了+ - * / 等操作时,会自动的进行拆箱操作,最终会比较两端的数值大小。

当 “==”运算符的两个操作数都是 包装器类型的引用,则是比较指向的是否是同一个对象,而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。

Java使用自动装箱和拆箱机制,节省了常用数值的内存开销和创建对象的开销,提高了效率。通过上面的研究和测试,结论如下:

(1)Integer和 int之间可以进行各种比较;Integer对象将自动拆箱后与int值比较

​ (2)两个Integer对象之间也可以用>、<等符号比较大小;两个Integer对象都拆箱后,再比较大小

​ (3) 两个Integer对象最好不要用==比较。因为:-128~127范围(一般是这个范围)内是取缓存内对象用,所以相等,该范围外是两个不同对象引用比较,所以不等。

相关知识

爱捣鼓Shell编程3:相等判断符=、==、
一道js题 [] == ![] 引发关于严格运算符(===)和相等运算符(==)的思考?
Scala中的==与equals
多肉浇水问题(二)——如何判断多肉是否缺水?
如何判断货架承重是否合格?
[题目]如图所示是探究“电流通过导体时产生热量的多少与哪些因素有关 的实验装置.两个透明绝热容器中密封着等质量的空气.U形管中液面高度的变化反应密闭空气温度的变化.下列说法正确的是A. 甲实验是为了研究电流产生的热量与电阻的关系B. 甲实验通电一段时间后.左侧容器内空气吸收的热量比右侧容器内空气吸收热量少C. 乙实验是为了研究电流产生的� 题目和参考答案——青夏教育精英家教网——
使用按内容相等行为创建对象表达式
如何判断花店是否正规?
​简单四步,快速判断真菌是否成功侵染宿主植物
怎么判断是否对杨树花过敏

网址: 判断两个Integer是否相等,使用==会产生的问题分析 https://m.huajiangbk.com/newsview1101458.html

所属分类:花卉
上一篇: 遇到问题
下一篇: 水仙花和风信子的区别,教你三种区