2009-06-23 3 views
6

私のコードでは、デフォルトではすべてのリストに対してArrayList、すべてのマップに対してHashMap、すべてのセットに対してHashSetを使用しています。Java Collections実装(HashMapsとHashSet、HashTable ...など)間違ったものを選択するコストはいくらですか?

間違った実装を選択して、柔軟性、スケーラビリティ、可読性、パフォーマンスをどれだけ失うのでしょうか。いつ他のものを使うのではなく、1つを使うことを決定するのに時間を費やすのは意味がありますか?

私は確かに、特定の状況でArrayListの代わりにLinkedListを使用する理由について、非常に明確なケースを見ています。誰かがそれが重要であると感じるとき、彼らはTreeMapやHashTableではなくHashMapを使用しますか?セットはどうですか?

質問:

  1. 悪い選択のコストは何ですか?
  2. 間違った実装とデータセンターで火災が発生した場合の災害の話はありますか?
  3. いいえ、大丈夫ですか?
  4. あなたが暮らすことができない不明瞭なコレクションの実装はありますか?

私が通じ読んだ:私はthis質問を見つけた

+0

これは実際には4つの質問と1つの質問ではなく、より多くの質問があります。 – cletus

+0

おそらく関連する回答:http://bit.ly/1NSlx – OscarRyz

+0

URL短縮なしhttp://stackoverflow.com/questions/532521/ which-data-structure-uses-more-memory/532569#532569 –

答えて

7

これは非常に一般的な質問ですが、私はいくつかのthougtsでスローします。

プログラミング向けのインターフェイスであれば、柔軟性が失われることはありません。 例

void foo(List<E> list); 

にはあまり選択のコストパフォーマンスのペナルティで見ることができました。たとえば、(ArrayListのように)直接アクセスがあなたが探しているものである場合、LinkedListを選択します。

セットには同様の問題があります。重複のないソートされたコレクションを保持したい場合、SortedSetはHashSetよりも賢明な選択肢になります。後者では、you'd

<EDIT>mapsとして

、異なる実装が多い(これは、()Collections.sortへの呼び出しである)を手動でセット全体をソートしなければなりません。それぞれは異なる目的を持っています。 たとえば、analog to SortedSet SortedMapがあります。その後、WeakHashMapがあります。ガベージコレクタによってキーが削除されるという意味で、HashMapのようには機能しません。 あなたが想像するように、HashMapとWeakHashMapの間の選択は自明ではありません。いつものように、あなたがそれらで実装したいものに依存します。物語について

</EDIT>

パフォーマンスが影響を受けたために、私の現在のプロジェクトでは、我々はにSortedSetでHashSetのを置き換えます。 DataCenterは火をつかまえていませんでした。

私の2セントです。

1

抽象的なタイプに応じて、OOの練習がになっている限り、重要なことは何ですか?

たとえば、間違って使用した場合は、使用する実装を変更するだけで、すべての依存関係はMapにあるため、以前と同じようにパフォーマンス特性が異なります。

+1

ArrayListのパフォーマンス特性の一部に頼っていて、LinkedListが必要であることに気づいた場合に問題が発生することがあります。 LinkedListで非効率なコードの部分を書き直さなければならないかもしれません。 –

1

私はあなたの主な実装としてHashMapの、HashSetの、とのArrayListを使用して罰金だと思います。ソートされたセットが必要な場合は、TreeSetが利用可能であることを知っておくとよいでしょう。あなたが再帰的な種類のものをやっているとき、同様にLinkedListをバックポケットに入れてもいいです。しかし、インターフェイスをプログラムし、必要に応じて実装を交換することができます。そして、同じコレクションが(例えば)LinkedListとArrayListの両方で処理する必要がある場合、他のコレクションから1つを構築することは大したことではありません。あなたがリストアップしました既定の実装と

作業。パフォーマンス上の問題があり、代替実装がより良いと思われる理由がある場合は、それをスワップして差異を測定します。特別な動作(ソートされたセットなど)が必要な場合は、特別なクラスを使用します。

この方法ではまだ私を焼いていません。

関連する問題