Java中的整数比较

Java中的整数比较,java,equality,boxing,Java,Equality,Boxing,Java中的整数比较很棘手,因为int和Integer的行为不同。我明白了 但是,如图所示,(整数)400(第4行)的行为不同于(整数)5(第3行)。这是为什么 import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { System.out

Java中的整数比较很棘手,因为
int
Integer
的行为不同。我明白了

但是,如图所示,
(整数)400
(第4行)的行为不同于
(整数)5
(第3行)。这是为什么

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.format("1. 5              == 5            : %b\n", 5 == 5);
        System.out.format("2. (int)5         == (int)5       : %b\n", (int)5 == (int)5);
        System.out.format("3. (Integer)5     == (Integer)5   : %b\n", (Integer)5 == (Integer)5);
        System.out.format("4. (Integer)400   == (Integer)400 : %b\n", (Integer)400 == (Integer)400);
        System.out.format("5. new Integer(5) == (Integer)5   : %b\n", new Integer(5) == (Integer)5);
    }
}
结果

如果要装箱的值p为true、false、一个字节或\u0000到\u007f范围内的字符,或一个介于-128和127(包括-128和127)之间的整数或短数字,则让r1和r2为p的任意两个装箱转换的结果。r1==r2总是这样

理想情况下,装箱一个给定的原语值p,总是会产生一个相同的引用。在实践中,使用现有的实现技术可能不可行。上述规则是一种务实的妥协。上面的最后一条要求将某些公共值始终装箱到不可区分的对象中。实现可以延迟或急切地缓存这些数据。对于其他值,此公式不允许程序员对装箱值的标识进行任何假设。这将允许(但不要求)共享部分或所有这些引用

这确保了在大多数常见情况下,行为将是所需的,而不会造成不适当的性能损失,尤其是在小型设备上。例如,内存限制较少的实现可能会缓存所有char和short值,以及-32K到+32K范围内的int和long值

以下是一段引自:

如果要装箱的值p为true、false、一个字节或\u0000到\u007f范围内的字符,或一个介于-128和127(包括-128和127)之间的整数或短数字,则让r1和r2为p的任意两个装箱转换的结果。r1==r2总是这样


简而言之,
Integer
使用池,因此对于-128到127之间的数字,装箱后将始终得到相同的对象,例如
newinteger(120)==newinteger(120)
将计算为
true
,但
newinteger(130)==newinteger(130)
将计算为
false

,因为在将文本自动装箱为
整数时,计算如下:

(Integer)400 --- Integer.valueOf(400)
valueOf的实现使得某些数字被“池化”,并且对于小于128的值,它返回相同的实例。

由于
(整数)5
小于128,它将被合并,而
(整数)400
将不会被合并

因此:

3. (Integer)5     == (Integer)5   : true  // Expected -- since 5 is pooled (i.e same reference)


这可能会帮助您检查可能的重复:如果是这种情况,那么依赖自动装箱/取消装箱的代码将受到影响,这将使代码模糊不清。有点令人不安
3. (Integer)5     == (Integer)5   : true  // Expected -- since 5 is pooled (i.e same reference)
4. Integer(400)   == (Integer)400 : false // WHAT? -- since 400 is not pooled (i.e different reference)