ポイントを説明するために、次の単純なクラスを用意します。
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;
}
}