JAVA中Integer类型变量比较问题
2017-11-11 19:19
393 查看
今天在做实验的时候,发现了一个比较奇怪的问题:两个Integer型变量用==进行比较时,有时候能成功有时候不能成功。举个例子:代码1:
Integer l1 = 122; Integer l2 = 122; if(l1 == l2) System.out.println("Right"); else System.out.println("Wrong");运行这段代码时,程序会输出:Right。对于另一个例子:代码2:
Integer l1 = 233; Integer l2 = 233; if(l1 == l2) System.out.println("Right"); else System.out.println("Wrong");运行这段代码时,程序会输出Wrong。但当对代码2进行修改时:代码3:
Integer l1 = 233; int l2 = 233; if(l1 == l2) System.out.println("Right"); else System.out.println("Wrong");在运行这段代码时,程序会输出Right。如果换一种定义方式时:代码4:
Integer l1 = 233; Integer l2 = new Integer(233); if(l1 == l2) System.out.println("Right"); else System.out.println("Wrong");运行这段代码时,程序会输出Wrong。关于这种现象,查了下资料,总结如下:1.实际上Java中定义的Integer变量会通过Integer.valueOf()方法生成一个实例,即:Integer l1 = 122 会被编译成 Integer l1 = Integer.valueOf(122),而关于valueOf()方法的源码:
public static Integer valueOf(int i) {assert IntegerCache.high >= 127;if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}看一下源码就会明白,对于-128到127之间的数,会进行缓存,Integer l1 = 122时,会将122进行缓存,下次再写Integer l2 = 122时,就会直接从缓存中取,就不会new了,相当于生成的为同一个对象,。所以代码1的运行结果是Right。而对于这个范围之外的数值,valueOf()相会重新new一个对象,所以就不相等了,所以代码2的裕兴结果就是Wrong。2.对于代码3,Integer型变量与int型变量进行比较时,实质上是把Integer类型变量拆箱成int类型,然后进行比较,相等则返回true,否则返回false。此处的拆箱调用的是intValue()方法。所以代码3的运行结果是Right。3.对于代码4,就比较好解释了,因为new相当于重新定义了一个新的对象,即l1的引用实质是指向在堆中了,而l2实质是指向在常量池中了(关于变量在内存中的位置可参考:http://www.cnblogs.com/wangkundentisy/p/6636340.html),所以两者是不可能相等的,故输出结果就是Wrong。4.总之,要想比较两个Intger型变量的值最好用Integer.intValue()方法生成int型后再比较。5.Integer型变量与int型变量之间可以直接比较,此时自动进行拆箱操作。参考: 1.https://www.cnblogs.com/liuling/archive/2013/05/05/intAndInteger.html 2.http://blog.csdn.net/snail_rao/article/details/7639194 3.《JAVA核心技术》
相关文章推荐
- Java自动装箱解箱问题&&int和Integer类型==比较问题
- Java Integer和int类型变量的两两相等性比较
- Java的String.valueOf 转换 与、空串+类型变量转换与封装类(Integer)的toString方式转换比较
- java两Integer类型用==比较的问题
- Java的String.valueOf 转换 与、空串+类型变量转换与封装类(Integer)的toString方式转换比较。
- Java String类型变量的比较问题
- 【Java】Integer变量相等(==)比较问题
- 两个值相同的Integer类型用!=比较出错的问题
- java Integer和int之间==的比较问题。求解释
- Double与Float,Integer,Long封装类型的变量,比较大小时,
- Java变量类型的比较
- java中double类型变量保留小数点后两位的问题
- Java中Integer的变量比较源码解析
- Java中Integer的变量比较源码解析
- 今天遇到关于JAVA INTEGER类型的问题 不过还好 现在解决了,
- Integer类型数据比较大小问题:(Integer定义的是对象,养成使用equals方法的好习惯)
- java Integer == 比较的小问题
- 关于javaBean中boolean类型变量的set和get注入后传到前端JS中的问题
- java中Integer的比较的问题
- java基础知识4-变量比较,类型转换