Joh*_*int 15 java autoboxing equivalence
所以我今天被问到这个问题.
Integer a = 3;
Integer b = 2;
Integer c = 5;
Integer d = a + b;
System.out.println(c == d);
Run Code Online (Sandbox Code Playgroud)
这个节目打印出来的是什么?它返回true.我回答它总会打印出来,因为我理解自动(和自动联合)拳击.我的印象是,分配整数a = 3将创建一个新的整数(3),以便==将评估参考而不是原始值.
有谁能解释一下?
Pet*_*aný 20
高速缓存介于-128到127之间的盒装值.拳击使用Integer.valueOf
方法,它使用缓存.超出范围的值不会被缓存,并始终作为新实例创建.由于您的值属于缓存范围,因此使用==运算符值相等.
引用Java语言规范:
如果被装箱的值p为true,false,一个字节,范围为\ u0000到\ u007f的char,或者介于-128和127之间的int或短号,则让r1和r2为任意两个装箱转换的结果p.始终是r1 == r2的情况.
http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7
Dav*_*ant 11
这就是真正发生的事情:
Integer c = Integer.valueOf(5);
Integer d = Integer.valueOf(a.intValue() + b.intValue());
Run Code Online (Sandbox Code Playgroud)
Java维护Integer
-128到127之间的对象缓存.与以下内容比较:
Integer a = 300;
Integer b = 200;
Integer c = 500;
Integer d = a + b;
System.out.println(c == d);
Run Code Online (Sandbox Code Playgroud)
哪个应该打印false
.
缓存也发生在自动装箱之外,考虑一下:
Integer a = 1;
Integer b = new Integer(1);
Integer c = Integer.valueOf(1);
System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == a);
Run Code Online (Sandbox Code Playgroud)
这将打印:
false
false
true
Run Code Online (Sandbox Code Playgroud)
==
一般来说,在比较对象时你要远离
归档时间: |
|
查看次数: |
4822 次 |
最近记录: |