いくつかのモデル オブジェクトを含む 2 つの arraylist があります。これらの arraylist の違いを見つけたいです。モデルの代わりに文字列を使用すると、コレクション フレームワークの removeall 関数で違いがわかりました。ただし、モデル オブジェクトの場合は機能しません。誰か助けてください
4 に答える
equals
andをカスタム オブジェクトに実装すると、shashCode
で行ったのと同じアプローチを使用できますString
。
2 つの ArraList を比較するには、2 つのオブジェクトを比較する必要があります。あなたの場合、それはモデル オブジェクトであるため、equals メソッドをオーバーライドする必要があります。このコードを試してください @Override public boolean equals(Object compareObj) { if (this == compareObj) return true;
if (compareObj == null)
return false;
if (!(compareObj instanceof MyModel))
return false;
MyModel model = (MyModel)compareObj;
return this.name.equals(model.name); // Are they equal?
}
@Override
public int hashCode()
{
int primeNumber = 31;
return primeNumber + this.name.hashCode();
return 0;
}
String
クラスはすでにメソッドのバージョンをオーバーライドしているためequals
、hashCode
メソッドを使用できますremove()
。コレクションでクラスを使用する必要がある場合は、クラスで (List or Set)
これらのメソッドをオーバーライドする必要があります。そうしないと、これらのメソッドのデフォルトの実装が使用されます。
2 つのオブジェクトが論理的に等しい場合、それらhashCode
は等しい必要があり、equals() を満たす必要があることを意味します。
メソッドは、モデル クラスについて何もremoveAll
知らない汎用ライブラリ メソッドです。では、少し考えてみると、どれが「同じ」かをどのように判断するのでしょうか?
簡単な答えは、クラスのメソッドをオーバーライドequals()
する必要があるということですModel
。これがチェックの基になっているためです。実装は、同じと見なしたいモデル インスタンスのペアに対して true を返す必要があります。デフォルトの継承された動作は、それらがメモリ内の同じオブジェクトである場合にのみ true を返します。(そしていつものように、オーバーライドするときはオーバーライドequals()
する必要もありhashCode()
ます)。