2016-02-27 10 views
6

私はHashMapに基づいてHashSetを理解しています。かなり類似しているからです。コードの柔軟性を高め、実装作業を最小限に抑えます。しかし、クラスがnull要素を禁じるならば、HashSetのEntryの参照変数は私にとっては不必要なように見えるので、Entry全体は意味を持ちません。この事実にもかかわらず、Entryは24バイトのメモリ/要素を占めますが、セットの要素を持つ1つの配列は、私の数字が正しい場合は4バイト/要素しか必要としません。 (配列のヘッダーを除いて)Java HashSetのパフォーマンス

私の議論が正しいなら、利点は本当にこのパフォーマンスヒットの過体重ですか?

(私が間違っている場合、私はaswellそれから学ぶでしょう)

+1

単一の配列はHashSetではありません。あなたは単純な配列を持つO(1)contains()をどのように持っていますか? –

+2

@ JBNizet線形プロービング(または一般にオープンアドレッシング)は、ただ1つの配列で動作します。私はまた、デザインの決定は何か不思議ですが、ここで報告する著者が見つかったのかどうかはわかりません: –

+1

@JBNizet配列にはいくつかのタイプのハッシュテーブルを簡単に実装できます。 ...編集:リニアにはO(1)contains()が含まれていませんが、鳩は –

答えて

1

この質問は、主に意見ベースのですが、私はこのトピックに関するいくつかのポイントを要約します:

  • HashSetが登場何年も前にJava 1.2で動作していました。当時の設計上の意思決定の正確な理由を今は推測するのは難しいですが、明らかにJavaは負荷の高いアプリケーションには使用されませんでした。パフォーマンスはシンプルさよりも重要ではありませんでした。
  • HashSetはメモリ消費量が最適ではないということは間違いありません。問題は知られており、JDK-6624565のバグが登録されており、core-libs-devのディスカッションは時々開催されています。しかし、これは多くの現実世界のアプリケーションのためのブロックですか?おそらく、いいえ。
  • HashSetメモリ使用量が許容できないような一般的でないアプリケーションの場合、trove THashSetのような良い代替方法が既に用意されています。
  • オープンアドレス指定アルゴリズムには欠点があります。負荷係数が1に近い大きな性能低下。要素除去の困難さ。 related answerを参照してください。
関連する問題