0

コレクション内の同様のエントリを見つけるために、コレクションの contains メソッドの代わりに他に使用できるものは何ですか。

現在、私はこのような内容を使用しています

if (EntityTree.setMobileEnablerTxnList.contains(iMobileEnablerTxnList)) {

 }

ここで setMobileEnablerTxnList はセットです。

4

2 に答える 2

3

この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ます。

于 2012-08-30T07:04:38.500 に答える
0

の実装はList.contains()target.equals(element).

可能であれば、メソッドが常に非常に迅速に返される にリストを入れHashSetますcontains()

の使用は、HashSet再利用できる場合にのみメリットがありますList.contains()

コードは次のようになります。

Set set = new HashSet(EntityTree.setMobileEnablerTxnList);

if (set.contains(iMobileEnablerTxnList)) {

が適切にMobileEnablerTxnList実装されていることを確認する必要がhashCode()あります。equals()

于 2012-08-30T07:06:44.890 に答える