我的代码是:
public class Box
{
public static void main(String[] args)
{
Integer z = new Integer(43);
z++;
Integer h = new Integer(44);
System.out.println("z == h -> " + (h == z ));
}
}
输出:-
z == h -> false
当两个对象的值相等时,为什么输出为false?
有没有其他方法可以使物体相等?
否。使用h.equals(z)
而不是h == z
来获得您期望的相等行为。
h == z
只有在通过自动装箱(即Integer a = 43
)分配值并且值在-128和127之间(缓存值)时才有效,即:
Integer a = 44;
Integer b = 44;
System.out.println("a == b -> " + (a == b));
输出:
a == b -> true
如果该值超出范围[-128, 127]
,则返回false
Integer a = 1000;
Integer b = 1000;
System.out.println("a == b -> " + (a == b));
输出:
a == b -> false
然而,比较两个对象的正确方法是使用Integer.equals()
方法。
Integer
是Object not primitive(int),与equals
方法相比对象相等。
当您执行z == h
时,它不会取消框为int
值,除非它检查两个Integer
引用(z&h)是否引用相同的引用。
正如它在文档中派生的那样-
当且仅当参数不为null且为包含与此对象相同int值的Integer对象。
System.out.println("z == h -> " + h.equals( z));
它将打印true
。
您试图比较两个不同的对象,而不是它们的值。z和h指向两个不同的Integer对象,这两个对象具有相同的值。
z == h
将检查两个对象是否相等。所以它将返回false。
如果要比较Integer对象存储的值,请使用equals
方法。
Integer z = new Integer(43); // Object1 is created with value as 43.
z++; // Now object1 holds 44.
Integer h = new Integer(44); // Object2 is created with value as 44.
最后,我们有两个不同的Integer对象,即值为44的对象1和对象2。现在
z = h
这将检查z和h指向的对象是否相同。即object1 == object2
这是错误的。如果你做
Integer z = new Integer(43); // Object1 is created with value as 43.
z++; // Now object1 holds 44. Z pointing to Object1
Integer h = z; // Now h is pointing to same object as z.
现在
z == h
将返回true。
这可能会有所帮助http://www.programmerinterview.com/index.php/java-questions/java-whats-the-difference-between-equals-and/
Integer是一个对象,而不是基元。如果z&h是基元,==可以正常工作。在处理对象时,==运算符不检查是否相等;它检查两个引用是否指向同一个对象。
因此,使用z.equals(h);
或h.equals(z);
These应返回true。
阅读以下内容:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Integer.html
Integer是比较对象的地址/引用/指针而不是值的对象。
Integer a = Integer(1);
Integer b = Integer(1);
a == b; // false
a.compareTo(b); // true
检查以确保可以在Integer对象上使用z++。