ConcurrentHashMap
Java で弱いキーと ID ハッシュを使用して を取得するにはどうすればよいですか? Google Guava Collections はそのようなものを提供できると思いますが、標準ライブラリから取得できますか? 他にどのようなオプションがありますか?
4 に答える
Google Guava Collections はそのようなものを提供できると思いますが、標準ライブラリから取得できますか?
これに対する簡単な答えはノーです。Java SE は、この特定の組み合わせを実装していません。
java.util.concurrent.ConcurrentHashMap
キーを使用して をインスタンス化し、WeakReference
壊れた参照のマップ エントリの削除を実装するために追加の作業を行うことはできますが、ID ハッシュ セマンティクスは得られません。java.util.IdentityHashMap
キーを使用して をインスタンス化し、WeakReference
壊れた参照のマップ エントリの削除を実装するために追加の作業を行うことはできますが、それでは同時動作は得られません。を使用して
java.util.WeakHashMap
も、同時実行性も ID ハッシュも得られません。equals
(理論的には) 自然とhashcode
メソッドをオーバーライドする何かでキー クラスをラップすることができます。しかし、それでは使えない可能性が高いです。ConcurrentHashMap
またはのメソッドをオーバーライドすることでこれを行うことはできないと思いますIdentityHashMap
。
おそらく唯一の実行可能なオプションは、主要なクラスとメソッドを ID ベースに変更することです。しかし、これは「組み込み」キー タイプ (特にキー タイプ) や、アプリケーションの他の部分で値ベースの equals/hashcode が必要な場合には機能しません。equals
hashcode
final
Google Guava の実装は、最も簡単な方法のようです。必要なマップを で初期化し、new MapMaker().weakKeys().makeMap()
を使用するのと同じように使用できますjava.util.concurrent.ConcurrentHashMap
。詳細については、apidocを参照してください。
アプリケーションがSpring Framework (バージョンは gt 3.2 ) の下にある場合は、使用を検討できますorg.springframework.util.ConcurrentReferenceHashMap
。以下はその説明です。
キーと値の両方にソフト参照または弱参照を使用する ConcurrentHashMap。このクラスは、Collections.synchronizedMap(new WeakHashMap>()) の代替として使用して、同時にアクセスしたときのパフォーマンスを向上させることができます。この実装は、null 値と null キーがサポートされていることを除いて、ConcurrentHashMap と同じ設計制約に従います。
注: 参照の使用は、マップに配置されたアイテムが後で使用可能になるという保証がないことを意味します。ガベージ コレクターはいつでも参照を破棄する可能性があるため、不明なスレッドがエントリを黙って削除しているように見える場合があります。
明示的に指定されていない場合、この実装はソフト エントリ参照を使用します。
ConcurrentWeakIdentityHashMap を検索すると、多くの例が得られます。org/ehcache/core/internal/util/ConcurrentWeakIdentityHashMap$WeakReference の hashCode がとても悪いと思うので、私は自分で実装を書きました。
ehcache3 ConcurrentWeakIdentityHashMap キー hashCode を修正するためのプル リクエスト