コレクション内の同様のエントリを見つけるために、コレクションの contains メソッドの代わりに他に使用できるものは何ですか。
現在、私はこのような内容を使用しています
if (EntityTree.setMobileEnablerTxnList.contains(iMobileEnablerTxnList)) {
}
ここで setMobileEnablerTxnList はセットです。
コレクション内の同様のエントリを見つけるために、コレクションの contains メソッドの代わりに他に使用できるものは何ですか。
現在、私はこのような内容を使用しています
if (EntityTree.setMobileEnablerTxnList.contains(iMobileEnablerTxnList)) {
}
ここで setMobileEnablerTxnList はセットです。
このcontains
メソッドは、必ずしも非常に重い (時間がかかる)とは限りません。たとえば、 a を使用するHashSet
と、かなり高速になります。a のHashSet
場合、オブジェクトの を計算hashCode
し、対応する「バケット」内のオブジェクトのみを調べます。すべての要素を網羅するわけではありません (または、hashCode
メソッドの実装が非常に貧弱になります)。
これは、メソッドのソース コードで確認できますHashSet#contains
。最終的には、次のコードを呼び出しますHashMap
。
final Entry<K,V> getEntry(Object key) {
int hash = (key == null) ? 0 : hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
}
return null;
}
これは、限られたオブジェクトのセットのみをループすることを明確に示しています。
a の詳細については、この質問も参照してくださいHashMap
( a によって内部的に使用されますHashSet
)
最後のアドバイス: パフォーマンスに問題がある場合は、プロファイラーを使用して、実際のボトルネックがどこにあるかを確認してください。私はそれが電話に出ることを疑いcontains
ます。
の実装はList.contains()
、target.equals(element)
.
可能であれば、メソッドが常に非常に迅速に返される にリストを入れHashSet
ますcontains()
。
の使用は、HashSet
再利用できる場合にのみメリットがありますList.contains()
。
コードは次のようになります。
Set set = new HashSet(EntityTree.setMobileEnablerTxnList);
if (set.contains(iMobileEnablerTxnList)) {
が適切にMobileEnablerTxnList
実装されていることを確認する必要がhashCode()
あります。equals()