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

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

Integer a = 5 ; 被称为autoboxing,编译器将此表达式转换为实际

 Integer a = Integer.valueOf(5); 

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

 Integer a = 5; Integer b= 5; 

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

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

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

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

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

整数包装器共享String类的几个属性。 因为它是不可变的 ,可以通过使用类似intern()的function来利用它。

分析一下:

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

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

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

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