请看下面的代码
class TestToString
{
public static void main(String args[])
{
CheckToString cs = new CheckToString (2);
CheckToString c = new CheckToString (2);
if( cs.equals(c))
System.out.println(" Both objects are equal");
else
System.out.println(" Unequal objects ");
}
}
class CheckToString
{
int i;
CheckToString ()
{
i=10;
}
CheckToString (int a)
{
this.i=a;
}
}
输出: 不等对象
但我期待输出将是
两个对象是相等的
我知道这两个对象有不同的引用,
System.out.println(cs); //com.sample.personal.checkToString@19821f
System.out.println(c); //com.sample.personal.checkToString@addbf1
但我在问,为什么他们有不同的引用? 而在下面的例子中,对象具有相同的内存位置。
Integer a = new Integer(2);
Integer b = new Integer(2);
System.out.println(a); //2
System.out.println(b); //2
我正在比较用户定义类的对象和预定义类的对象。 似乎用户定义类的对象与 Integer 类的对象行为相同,其值超出 -128 到 127。为什么这两种情况的引用不同? (对于值在 -128 到 127 之间的 Integer 类相同,对于用户定义的类不同)
最佳答案
equals
的默认实现检查引用。您正在创建 2 个不同的对象,它们在内存中引用的不是同一事物。
一个像样的 equals 实现应该是这样的:
public boolean equals(Object o) {
if (!(o instanceof CheckToString)) {
return false;
}
CheckToString other = (CheckToString) o;
return i == other.i;
}
当重写equals
时,你也需要重写hashCode
。
无论何时您使用 new CheckToString()
,您都在内存中创建一个新对象,因此这是一个与另一个 new CheckToString()
完全不同的引用。对象定义中的内容并不重要。
您提到的有关 Integer 的内容是真实的,但它适用于 Integer
,不适用于您创建的自定义对象。
关于java - .equals() 用于 Java 中的用户定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12972362/