1

如果我写下面的代码(在java中):

Integer a =new Integer(5);
Integer b=new Integer(5);
if(a==b){
  System.out.println("In ==");
}
if(a.equals(b)){
 System.out.println("In equals");
}

我的输出是:“等于”但是如果我将第一行和第二行更改为 ->

Integer a =5;
Integer b=5;

那么我的o/p是:

In == 
In equals

那么创建 Integer 对象有什么区别呢?当我们这样做时它是如何创建的Integer a =5

Integer a=5如果我创建并创建另一个对象,这是否意味着 a 和 b 对象引用同一个对象Integer b=5

4

5 回答 5

7

Integer a = 5; 称为自动装箱,编译器将此表达式转换为实际的

Integer a = Integer.valueOf(5);

对于小数字,默认情况下为 -128 到 127,Integer.valueOf(int) 不会创建 Integer 的新实例,而是从其缓存中返回一个值。所以在这里

Integer a = 5;
Integer b= 5;

ab指向同一个对象和a == btrue

于 2013-09-04T03:32:28.600 回答
2

在 Java 中,您永远不应该使用新的 Integer,即使它是有效的语法,它也不是您发现的声明整数的最佳方式。改用 Integer.valueOf(int) 这有多个优点。

您不会不必要地创建额外的对象。每当您使用 new 运算符时,您都会强制 vm 创建一个在大多数情况下不需要的新对象。valueOf(int) 将返回一个缓存副本。由于整数对象是不可变的,因此效果很好。这意味着您可以使用 == 尽管在实践中您应该像在Apache ObjectUtils中那样使用空安全比较

== 运算符测试相等性。只有当它们引用内存中的同一个对象时,引用才相等。 equals 方法确保 2 个对象实例彼此“等效”。

Integer a = new Integer(5);
Integer b = a;

a == b; // true!
a.equals(b); // true
b = new Integer(5);
a == b; // false
a.equals(b); // true

只要它们的值相同,基元就相等。

int a = 5; int b = a;
a == b;  // true!
于 2013-09-04T03:31:53.360 回答
1

对于像相等运算符这样的原始数据类型int,将检查变量的值是否相等

对于像你的对象这样的引用数据类型java.lang.Integer,相等运算符将检查变量是否引用同一个对象。在第一种情况下,您有两个“新”且单独的整数对象,因此引用不同

于 2013-09-04T03:18:45.533 回答
0

整数包装器共享 String 类的一些属性。因为它是不可变的,并且可以通过使用类似 intern() 的功能来利用。

分析这个:

String a = "foo";
String b = "foo";
String c = new String("foo");
String d = new String("foo");

a == b   //true
c == d   //false

原因是当 JVM隐式创建一个新的 String 对象时,它会重用具有相同值“foo”的现有 String 对象,例如 a 和 b。

在您的情况下,JVM 隐式自动装箱int 并重新使用现有的 Integer 对象。Integer.valueOf()如果可用,可以显式地用于重用现有对象。

于 2013-09-04T03:32:22.283 回答
0

我相信当您使用 new 运算符创建时,它会创建对象引用。在第一种情况下,有两个对象引用,它们不相同但它们的值相同。第二种情况并非如此。

于 2013-09-04T03:33:31.407 回答