将Integers与==进行比较究竟做了什么?

Bad*_*est 11 java compare wrapper

编辑:好的,好的,我误读了.我不是将int与Integer进行比较.正好指出.

我的SCJP书说:

当==用于将基元与包装器进行比较时,包装器将被解包,并且比较将是原始的.

所以你认为这段代码会打印出来true:

    Integer i1 = 1; //if this were int it'd be correct and behave as the book says.
    Integer i2 = new Integer(1);
    System.out.println(i1 == i2);
Run Code Online (Sandbox Code Playgroud)

但它打印出来false.

另外,根据我的书,这应该打印true:

Integer i1 = 1000; //it does print `true` with i1 = 1000, but not i1 = 1, and one of the answers explained why.
Integer i2 = 1000;
System.out.println(i1 != i2);
Run Code Online (Sandbox Code Playgroud)

不.是的false.

是什么赋予了?

Nul*_*ion 12

另请注意,较新版本的Java缓存Integer在-128到127范围内(256个值),这意味着:

Integer i1, i2;

i1 = 127;
i2 = 127;
System.out.println(i1 == i2);

i1 = 128;
i2 = 128;
System.out.println(i1 == i2);
Run Code Online (Sandbox Code Playgroud)

将打印truefalse.(在ideone上看到它)

道德:为了避免问题,.equals()在比较两个对象时总是使用.

当你==用来比较一个包裹的原语和一个原语(例如:Integerwith int)时,你可以依赖取消装箱,但如果你要将两个Integers 进行比较==,那么@ dan04解释的原因就会失败.


Joh*_*ica 8

Integer i1 = 1;
Integer i2 = new Integer(1);
System.out.println(i1 == i2);
Run Code Online (Sandbox Code Playgroud)

当您为该i1值赋值1时,将装箱,创建一个Integer对象.然后比较比较两个对象引用.引用不相等,因此比较失败.

Integer i1 = 100;
Integer i2 = 100;
System.out.println(i1 != i2);
Run Code Online (Sandbox Code Playgroud)

因为这些是使用编译时常量初始化的,所以编译器可以并且实际执行它们并使两者都指向同一个Integer对象.

(注意,我将值从1000更改为100.正如@NullUserException指出的那样,只有小整数被实现.)


这是一个非常有趣的测试.看看你是否能解决这个问题.为什么第一个程序打印true,但第二个打印false?利用您对拳击和编译时间分析的了解,您应该能够解决这个问题:

// Prints "true".
int i1 = 1;
Integer i2 = new Integer(i1);
System.out.println(i1 == i2);

// Prints "false".
int i1 = 0;
Integer i2 = new Integer(i1);
i1 += 1;
System.out.println(i1 == i2);
Run Code Online (Sandbox Code Playgroud)

如果您了解上述内容,请尝试预测此程序打印的内容:

int i1 = 0;
i1 += 1;
Integer i2 = new Integer(i1);
System.out.println(i1 == i2);
Run Code Online (Sandbox Code Playgroud)

(你猜后,跑吧看看!)


dan*_*n04 6

您没有将基元与包装器进行比较.您正在比较两个包装器(引用类型). ==比较对象标识,它返回false是因为它们是不同的对象.