.equals()用于Java中的用户定义类

Jyo*_*jan 3 java equals user-defined

请参阅以下代码

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

输出: 不等的对象

但我期待输出会是

两个对象都是平等的

我明白这两个对象有不同的反馈,

System.out.println(cs); //com.sample.personal.checkToString@19821f
System.out.println(c); //com.sample.personal.checkToString@addbf1
Run Code Online (Sandbox Code Playgroud)

但我问,为什么他们有不同的推荐?而在下面的例子中,对象具有相同的存储位置.

Integer a = new Integer(2);
Integer b = new Integer(2);
System.out.println(a);           //2
System.out.println(b);           //2
Run Code Online (Sandbox Code Playgroud)

我将用户定义类的对象与预定义类的对象进行比较.似乎用户定义类的对象与Integer类的对象的行为相同,其值超过-128到127.为什么这两种情况的引用都不同?(对于Integer类,其值在-128到127之间,对于用户定义的类不同)

Dan*_* D. 6

equals检查引用的默认实现.您正在创建2个不同的对象,它们不会在内存中引用相同的内容.

一个体面的平等实现将是这样的:

public boolean equals(Object o) {
  if (!(o instanceof CheckToString)) {
    return false;
  }
  CheckToString other = (CheckToString) o;
  return i == other.i;
}
Run Code Online (Sandbox Code Playgroud)

覆盖时equals,您也需要覆盖hashCode.

无论何时你说new CheckToString(),你在内存中创建一个新对象,所以与另一个完全不同new CheckToString().对象定义中的内容无关紧要.

你提到的关于Integer的东西是真的,但它适用于Integer你创建的自定义对象,而不是它.

  • 所以基本上OP应该实现等于. (2认同)