整数a = 5和new Integer(5)有什么区别?

时间:2013-09-04 03:08:26

标签: java integer wrapper

如果我写下面的代码(在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创建它?

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

5 个答案:

答案 0 :(得分:6)

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

Integer a = Integer.valueOf(5);

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

Integer a = 5;
Integer b= 5;

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

答案 1 :(得分:1)

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

您无需不必要地创建额外的对象。无论何时使用new运算符,都要强制vm创建一个在大多数情况下不需要的新对象。 valueOf(int)将返回一个缓存副本。由于Integer对象是不可变的,因此效果很好。这意味着你可以使用==虽然在实践中你应该使用像Apache ObjectUtils

中的空安全比较

==运算符测试是否相等。引用仅在引用内存中的同一对象时才相等。 equals method确保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!

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

整数包装器共享String类的几个属性。因为它是 immutable ,可以通过使用 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。 / p>

在您的情况下,JVM隐式地auto-boxes int和重新使用现有的Integer对象。 Integer.valueOf()可以明确用于重用现有对象(如果可用)。

答案 4 :(得分:0)

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