关于自动装箱和对象相等/身份的 Java 问题

2022-09-02 11:23:24
public class Main { 
    /** 
      * @param args the command line arguments */ 
    public static void main(String[] args) { 
        // TODO code application logic here
        int a1 = 1000, a2 = 1000; 
        System.out.println(a1==a2);//=>true 
        Integer b1 = 1000, b2 = 1000;
        System.out.println(b1 == b2);//=>false 
        Integer c1 = 100, c2 = 100; 
        System.out.println(c1 == c2);//=>true 
    }

}

为什么是假的和真的?b1 == b2c1 == c2


答案 1

阅读此内容

Java 对 s 使用 -128 到 127 范围内的Integer

这意味着,如果创建了一个 with,并且其值介于 -128 和 128 之间,则不会创建新对象,但会返回池中的相应对象。这就是为什么 确实与 相同的原因。IntegerInteger i = 42;c1c2

(我假设您知道==在应用于对象时比较引用,而不是值)。


答案 2

已经给出了正确的答案。但只是为了补充我的两分钱:

Integer b1 = 1000, b2 = 1000;

这是一个可怕的代码。对象应通过构造函数或工厂方法初始化为对象。例如:

 // let java decide if a new object must be created or one is taken from the pool
Integer b1 = Integer.valueOf(1000);

 // always use a new object
 Integer b2 = new Integer(1000);

此代码

Integer b1 = 1000, b2 = 1000;

另一方面,暗示整数是一个基元,但事实并非如此。实际上,您所看到的只是捷径

Integer b1 = Integer.valueOf(1000), b2 = Integer.valueOf(1000);

和 Integer 仅将对象从 -127 池到 127,因此在这种情况下,它将创建两个新对象。因此,尽管 1000 = 1000,但 b1 != b2。这是我讨厌自动拳击的主要原因。