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)
将打印true和false.(在ideone上看到它)
道德:为了避免问题,.equals()在比较两个对象时总是使用.
当你==用来比较一个包裹的原语和一个原语(例如:Integerwith int)时,你可以依赖取消装箱,但如果你要将两个Integers 进行比较==,那么@ dan04解释的原因就会失败.
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)
(你猜后,跑吧看看!)
| 归档时间: |
|
| 查看次数: |
3410 次 |
| 最近记录: |