为什么在Java中比较IntegerWrappers时128=128为false,而127=127

为什么在Java中比较IntegerWrappers时128=128为false,而127=127为真?

class D {
    public static void main(String args[]) {
        Integer b2=128;
        Integer b3=128;
        System.out.println(b2==b3);
    }}

产出:

false

class D {
    public static void main(String args[]) {
        Integer b2=127;
        Integer b3=127;
        System.out.println(b2==b3);
    }}

产出:

true

注:-128至127之间的数字为真。


萧十郎
浏览 785回答 3
3回答

慕斯王

在用Java编译数字文字并将其分配给Integer(大写)时I)编译器发出:Integer&nbsp;b2&nbsp;=Integer.valueOf(127)使用自动装箱时也会生成这一行代码。valueOf实现,使某些数字被“池”化,并且它返回小于128的值的相同实例。来自java 1.6源代码,第621行:public&nbsp;static&nbsp;Integer&nbsp;valueOf(int&nbsp;i)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if(i&nbsp;>=&nbsp;-128&nbsp;&&&nbsp;i&nbsp;<=&nbsp;IntegerCache.high) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;IntegerCache.cache[i&nbsp;+&nbsp;128]; &nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Integer(i);}价值high可以使用系统属性将其配置为另一个值。-Djava.lang.Integer.IntegerCache.High=999如果您使用该系统属性运行您的程序,它将输出true!显而易见的结论是:永远不要依赖两种引用是相同的,总是将它们与之进行比较。.equals()方法。所以b2.equals(b3)将为所有逻辑上相等的值b2,b3打印true。注意,Integer缓存的存在并不是因为性能原因,而是为了与JLS,第5.1.7节;必须给出值的对象标识-128到127包含在内。整数#值(Int)还记录了这种行为:通过缓存频繁请求的值,此方法可能获得更好的空间和时间性能。此方法将始终将值缓存在范围-128至127(包括在内),并可能缓存此范围之外的其他值。

30秒到达战场

自动装箱缓存-128到127。这是在JLS中指定的(5.1.7).如果值&nbsp;p&nbsp;装箱是true,false,一个字节,\u0000到\u007f范围内的一个字符,或者是-128到127之间的int或短数,那么让r1和r2是p的任意两个装箱转换的结果。在这种情况下,r1=r2。处理对象时要记住的一条简单规则是-use.equals如果您想检查这两个对象是否“相等”,请使用=当您想要查看它们是否指向同一个实例时。

哈士奇WWW

使用基本数据类型(INT),在这两种情况下都会产生预期的输出。但是,由于您使用的是Integer对象,因此=操作符的含义有所不同。在对象的上下文中,=检查变量是否引用同一个对象引用。要比较对象的值,应该使用Eques()方法,例如。&nbsp;b2.equals(b1),它将指示b2是小于b1、大于还是等于(有关详细信息,请查看api)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java