あなたはおそらく正しいでしょう。私は実際にランダム アクセス機能の使用を放棄することができ (それをどのように呼んでいるのでしょうか?)、オブジェクトの順序は気にしません。オブジェクトを追加して、それらすべてを反復処理できるようにする必要があるだけです。また、これは確かにセットです (同じオブジェクトを複数回必要とすることはありません) が、複数回追加しようとすることもありません... 代わりにリストを使用する必要があります (気にしませんが注文)?そのようなセットの最も効率的なデータ構造は何ですか?
HashSet は、キーをそれ自体にマップする HashMap として実装されるため、HashSet に切り替えても、パフォーマンスに関して大きな違いはありません。
他の代替手段は、TreeSet、または (アプリケーションが重複を挿入しようとしないと仮定して) List クラスの 1 つです。List が機能するようなアプリケーションの場合、ArrayList または LinkedList は、HashSet または TreeSet よりも効率的です。
ただし、アプリケーションが時間の 50% をメソッドに費やしていることには、非常に怪しい点がありますhashCode
。ハッシュ テーブルのサイズが変更されない限り、hashCode メソッドは、セットまたはマップ操作ごとに 1 回だけ呼び出す必要があります。add
したがって、大量のマップ/セットのサイズ変更が行われているか、膨大な数のセット操作を行っているかのいずれかです。(私の知る限り、オブジェクト ハッシュコード メソッドは安価なので、各呼び出しのコストは問題になりません。)
編集
nextInt() は本当に高価ですか? 代替案はありますか?
いいえ、高価ではありません。コードを見てください。Random クラス (および nextInt() メソッド) は AtomicLong を使用してスレッド セーフにするため、非スレッド セーフ バージョンをコーディングした場合は数サイクルを節約できます。ソースコードはJDKインストールディレクトリにあります...見てください。