Javaコレクションの実装(例:HashMaps vs HashSet vs HashTable…)、間違ったものを選択するコストはいくらですか? [閉まっている]
-
06-07-2019 - |
質問
デフォルトでは、すべてのリストにArrayList、すべてのマップにHashMap、すべてのセットにHashSetを使用します。
実用的な観点から、間違った実装を選択することで、柔軟性、スケーラビリティ、可読性、パフォーマンスがどれだけ失われますか?時間をかけて別のものではなく、どちらを使用するかを決めるのが理にかなっていますか?
特定の状況において、なぜ誰かがArrayListの代わりにLinkedListを使用するのかについては、非常に明確なケースがあります。誰かがそれが重要だと感じるとき、彼らはTreeMapやHashTableではなくHashMapを使用しますか?セットはどうですか?
質問:
- 不適切な選択のコストはいくらですか?
- 間違った実装を選択し、データセンターに火がついたという災害のストーリーはありますか?
- 良い経験則はありますか?
- これなしでは生きていけない不明瞭なコレクションの実装はありますか?
読み終えました:
- http://java.sun .com / j2se / 1.4.2 / docs / api / java / util / TreeMap.html
- http://java.sun .com / j2se / 1.4.2 / docs / api / java / util / HashMap.html
- Java:リストのArrayList、HashMap Map、HashSet for Set? など...
このの質問は理論的な観点から関連していることがわかりましたが、私はm現実の世界にもっと興味を持ち、溝の答えを見てください。
解決
これは非常に一般的な質問ですが、私はいくつかの考えを投げ込みます。
インターフェイスを指向したプログラミングをしている場合、柔軟性は大打撃を受けません。 例
void foo(List<E> list);
不十分な選択のコストは、パフォーマンスのペナルティで見ることができます。たとえば、(ArrayListのような)直接アクセスが必要な場合にLinkedListを選択します。
セットには同様の問題があります。重複のないソートされたコレクションを保持する場合、HashSetよりもSortedSetの方が賢明な選択です。後者では、Set全体を手動でソートする必要があります(これは、Collections.sort()の呼び出し)
&lt; EDIT&gt;
マップ 、さまざまな実装があります。それぞれに異なる目的があります。 たとえば、 SortedMap 、SortedSetに類似。次に、 WeakHashMap ガベージコレクターによってキーを削除できるという意味で、HashMapのようには機能しません。 ご想像のとおり、HashMapとWeakHashMapの選択は簡単ではありません。いつものように、それらで何を実装したいかに依存します。
&lt; / EDIT&gt;
ストーリーについては、現在のプロジェクトでは、パフォーマンスに影響があったため、HashSetをSortedSetに置き換えました。ただし、DataCenterは発火しませんでした。
私の2セント。
他のヒント
抽象オブジェクトに依存するという優れたオブジェクト指向プラクティスに従う限り、それは何を意味するのでしょうか?
たとえば、間違った Map
を使用していることがわかった場合は、使用している実装を変更するだけで、すべての依存関係が Map
にあるため、すべてが以前と同じように機能します異なるパフォーマンス特性を備えています。
HashMap、HashSet、ArrayListを主要な実装として使用しても大丈夫だと思います。ソートされたセットが必要な場合、TreeSetが利用可能であることを知っておくと便利です。同様に、再帰的なことをしているときは、バックポケットにLinkedListがあると便利です。ただし、インターフェイスにプログラムすれば、必要に応じて実装を交換できます。また、同じコレクションが(たとえば)LinkedListとArrayListの両方として処理する必要がある場合、一方を他方から構築することは大したことではありません。
リストしたデフォルトの実装で作業します。パフォーマンスの問題があり、代替実装の方が良いと信じる理由がある場合は、それを交換し、違いを測定します。特別な動作(ソートされたセットなど)が必要な場合は、特別なクラスを使用します。
このアプローチはまだ私を燃やしていません。