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

OOP*_*OOP 16 java autoboxing integer

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 
    }

}
Run Code Online (Sandbox Code Playgroud)

为什么是b1 == b2虚假和c1 == c2真实的?

Fel*_*ing 38

这个.

Java使用s 的,Integer范围从-128到127.

这意味着如果您创建一个Integerwith Integer i = 42;并且其值介于-128和128之间,则不会创建新对象,但会返回池中相应的对象.这就是为什么 c1确实是相同c2.

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

  • a1 == a2因为它们是原始的"int"类型,而不是Integer对象类型 (5认同)

Sea*_*oyd 11

已经给出了正确的答案.但只是加上我的两分钱:

Integer b1 = 1000, b2 = 1000;
Run Code Online (Sandbox Code Playgroud)

这是糟糕的代码.应通过构造函数或工厂方法将对象初始化为对象.例如

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

要么

 // always use a new object
 Integer b2 = new Integer(1000);
Run Code Online (Sandbox Code Playgroud)

这段代码

Integer b1 = 1000, b2 = 1000;
Run Code Online (Sandbox Code Playgroud)

另一方面,暗示Integer是一个原始的,它不是.实际上你所看到的是一条捷径

Integer b1 = Integer.valueOf(1000), b2 = Integer.valueOf(1000);
Run Code Online (Sandbox Code Playgroud)

和Integer只汇集-127到127之间的对象,因此在这种情况下它将创建两个新对象.因此,虽然1000 = 1000,但是b1!= b2.这是我讨厌自动拳击的主要原因.

  • `>这是糟糕的代码。对象应该通过构造函数或工厂方法初始化为对象。但这并不完全正确。当您创建 String 实例时,最佳实践是编写 `String str = "str";` (2认同)

Per*_*ega 0

你想要的答案就在这里