6

私のコードでは、デフォルトですべてのリストにArrayList、すべてのマップにHashMap、すべてのセットにHashSetを使用しています。

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

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

質問:

  1. 選択が不十分な場合のコストはいくらですか?
  2. 間違った実装を選択し、データセンターに火がついたという悲惨な話はありますか?
  3. 経験則はありますか?
  4. なくてはならないあいまいなコレクションの実装はありますか?

私は読み通しました:

私はこの質問が理論的な観点から関連していることを発見しましたが、私は現実の世界にもっと興味があります。

4

3 に答える 3

7

これは非常に一般的な質問ですが、いくつかの考えを投げかけます。

プログラミング指向のインターフェースを使用している場合、柔軟性は大きな打撃を受けません。例えば

void foo(List<E> list);

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

セットにも同様の問題があります。ソートされたコレクションを重複せずに保持したい場合は、HashSetよりもSortedSetの方が賢明です。後者の場合、セット全体を手動で並べ替える必要があります(つまり、Collections.sort()の呼び出し)。

<EDIT>

マップに関しては、さまざまな実装があります。それぞれに異なる目的があります。たとえば、 SortedSetに類似したSortedMapがあります。次に、ガベージコレクターによってキーを削除できるという意味で、HashMapのようには機能しないWeakHashMapがあります。ご想像のとおり、HashMapとWeakHashMapのどちらを選択するかは簡単ではありません。いつものように、あなたがそれらで何を実装したいかに依存します。

</EDIT>

ストーリーに関しては、私の現在のプロジェクトでは、パフォーマンスに影響があったため、HashSetをSortedSetに置き換えました。しかし、データセンターは発火しませんでした。

私の2セント。

于 2009-06-23T16:03:46.577 に答える
1

抽象型に依存するというOOの優れた慣習に従う限り、それは何を意味しますか?

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

于 2009-06-23T16:05:42.270 に答える
1

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

リストしたデフォルトの実装で作業します。パフォーマンスの問題があり、別の実装の方が良いと考える理由がある場合は、それを交換して、違いを測定します。特別な動作(たとえば、ソートされたセット)が必要な場合は、特別なクラスを使用します。

このアプローチはまだ私を燃やしていません。

于 2009-06-23T18:14:46.080 に答える