0

Joshua Bloch の「equals() メソッドのオーバーライド」に関するオンラインの章を読んでいました。ここにリンクがあります。次のセクションは私を混乱させます、

再帰性 - 最初の要件は、オブジェクトがそれ自体と等しくなければならないことだけを示しています。意図せずにこの要件に違反することは考えにくいです。これに違反してクラスのインスタンスをコレクションに追加した場合、コレクションの contains メソッドは、追加したばかりのインスタンスがコレクションに含まれていないことをほぼ確実に示します。

質問 - コレクションに追加されたインスタンスに対して、コレクションの contain メソッドが false を返すことは可能ですか?

試してみましたが、返される結果は常に true です。

4

3 に答える 3

1

質問 - コレクションに追加されたインスタンスに対して、コレクションの contain メソッドが false を返すことは可能ですか?

equals()本からの引用が説明しているように、追加されたオブジェクトが契約に違反しない限り、そうではありません。

@Karthik T で提案されているように、equals()無条件に返されるオブジェクトでこれを試してくださいfalse(したがって、契約に違反します)。

于 2013-01-05T16:25:51.250 に答える
1

ポイントを説明するために、次の単純なクラスを用意します。

class C {
    private int i;
    public C(int i) { this.i = i; }
}

今、あなたがするならば:

C c1 = new C(1);
C c2 = new C(1);

List<C> l = new ArrayList<C>();

l.add(c1);

l.contains(c2)両方のインスタンスが同じコンストラクター引数を持っているにもかかわらず、isなのでfalse、を返します。c2.equals(c1)false

これは、クラスがnoCをオーバーライドしないためです。.equals().hashCode()

Collection一般に、クラスが何らかの種類で使用されるようにバインドされるたびに、これらのメソッドの両方をオーバーライドすることをお勧めします。この場合:

// Note: final class, final member -- that makes this class immutable
final class C {
    private final int i;
    public C(int i) { this.i = i; }

    @Override
    public int hashCode() { return i; }
    @Override
    public boolean equals(Object o)
    {
        // no object equals null
        if (o == null)
            return false;
        // an object is always equal to itself
        if (this == o)
            return true;
        // immutable class: if the class of the other is not the same,
        // objects are not equal
        if (getClass() != o.getClass())
            return false;
        // Both objects are of the same class: check their members
        return i == ((C) o).i;
    }
}
于 2013-01-05T16:28:35.317 に答える
0

コレクションに追加されたばかりのオブジェクトに対して false を返す、コレクションの contains メソッドのデモを次に示します。Eclipse で生成された通常の equals と hashCode を使用し、equals メソッドを非反射型に変更しました。具体的には、オブジェクトをそれ自体と比較すると false を返します。

import java.util.LinkedList;
import java.util.List;

public class Test {
  int someValue;
  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + someValue;
    return result;
  }
  @Override
  public boolean equals(Object obj) {
    if (this == obj) {
      // Bad. Non-reflexive. Should return true.
      return false;
    }
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    Test other = (Test) obj;
    if (someValue != other.someValue)
      return false;
    return true;
  }
  public static void main(String[] args) {
    List<Test> myList = new LinkedList<Test>();
    Test myObject = new Test();
    myList.add(myObject);
    System.out.println(myList.contains(myObject));
  }
}
于 2013-01-05T16:56:39.043 に答える