如果我写下面的代码(在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
?
答案 0 :(得分:6)
Integer a = 5
;被称为自动装箱,编译器将此表达式转换为实际的
Integer a = Integer.valueOf(5);
对于小数字,默认情况下-128到127,Integer.valueOf(int)不会创建新的Integer实例,但会从其缓存中返回一个值。所以这里
Integer a = 5;
Integer b= 5;
a
和b
指向同一个对象,a == b
为true
。
答案 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运算符创建时,它会创建对象引用。在第一种情况下,有两个对象引用,它们不相同但它们的值相同。这不是第二种情况。