eno*_*kun 3 java autoboxing integer
我在Java(JDK 1.7)中偶然发现了这个:
Integer a = 100;
Integer b = 100;
Integer c = 1000;
Integer d = 1000;
System.out.println(a == b); //true
System.out.println(c == d); //false
System.out.println(new Integer(100) == new Integer(100)); //false
System.out.println(new Integer(1000) == new Integer(1000)); //false
Run Code Online (Sandbox Code Playgroud)
输出为:true false false false
为什么== b评估为真?这是什么原因?这类似于String内化吗?
这类似于String内化吗?
是 - 基本上所有可以放入一个字节(-128到+127)的整数都被实现,因此共享相同的底层对象.较大的都没有,因而可能不共享同一个底层对象(这是覆盖在JLS 5.1.7) -但请注意,没有什么在阻止更大的整数共享相同的底层对象,如果有人要选择规范以这种方式实现VM.
我猜想的理由是,在这个范围内"小"的整数,不经常使用更比大的,所以使用相同的基础对象是值得的,以减少潜在的内存占用.
在您的new Integer(100) == new Integer(100)示例中,情况并非如此,因为您显式创建了新的整数对象,类似于new String("hi") == new String("hi")计算结果为false.
只是再次重申-在所有现实世界中的场景比较类似这样的整数时,则.equals()(或优选地,用==原始整数,除非有一个很好的情况下,使用对象类型),应使用
| 归档时间: |
|
| 查看次数: |
2116 次 |
| 最近记录: |