Java整数自动自动装箱

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内化吗?

Mic*_*rry 6

这类似于String内化吗?

是 - 基本上所有可以放入一个字节(-128到+127)的整数都被实现,因此共享相同的底层对象.较大的都没有,因而可能不共享同一个底层对象(这是覆盖在JLS 5.1.7) -但请注意,没有什么在阻止更大的整数共享相同的底层对象,如果有人要选择规范以这种方式实现VM.

我猜想的理由是,在这个范围内"小"的整数,不经常使用更比大的,所以使用相同的基础对象是值得的,以减少潜在的内存占用.

在您的new Integer(100) == new Integer(100)示例中,情况并非如此,因为您显式创建了新的整数对象,类似于new String("hi") == new String("hi")计算结果为false.

只是再次重申-在所有现实世界中的场景比较类似这样的整数时,则.equals()(或优选地,用==原始整数,除非有一个很好的情况下,使用对象类型),应使用


归档时间:

查看次数:

2116 次

最近记录:

12 年,2 月 前