Как получить ConcurrentHashMap
со слабыми ключами и хэшами идентификации в Java? Я думаю, что Google Guava Collections может дать такую вещь, но могу ли я получить ее из стандартной библиотеки? Какие еще варианты у меня есть?
ConcurrentHashMap со слабыми ключами и хэш-идентификатором?
Ответ 1
Я думаю, что коллекции Google Guava могут дать такую вещь, но могу ли я получить ее из стандартной библиотеки?
Короткий ответ на этот вопрос: Нет. Java SE не реализует эту конкретную комбинацию.
-
Вы можете создать экземпляр
java.util.concurrent.ConcurrentHashMap
с ключамиWeakReference
и выполнить дополнительную работу по удалению записей карты для неработающих ссылок, но это не даст вам семантики хеш-символов. -
Вы можете создать экземпляр
java.util.IdentityHashMap
с помощьюWeakReference
и выполнить дополнительную работу по удалению записей карты для неработающих ссылок, но это не даст вам одновременного поведения. -
Использование
java.util.WeakHashMap
не даст вам ни concurrency, ни хеширования идентификаторов. -
Вы могли бы (теоретически) обернуть ключевой класс тем, что переопределило естественные методы
equals
иhashcode
. Но это, скорее всего, непригодно. -
Я не думаю, что это можно было бы сделать, переопределив методы в
ConcurrentHashMap
илиIdentityHashMap
.
Возможно, единственным жизнеспособным вариантом было бы изменить методы классов equals
и hashcode
на основе идентификации. Но это не будет работать для "встроенных" типов ключей (особенно final
) или для случаев, когда вам нужны значения equals/hashcode на основе значений в других частях приложения.
Ответ 2
Реализация Google Guava выглядит как самый простой способ. Можно инициализировать требуемую карту с помощью new MapMaker().weakKeys().makeMap()
и использовать так же, как использовать java.util.concurrent.ConcurrentHashMap
. Подробнее см. apidoc.
Ответ 3
выполните поиск ConcurrentWeakIdentityHashMap, вы получите много примеров. Я сам написал реализацию, потому что я думаю, что хэш-код org/ehcache/core/internal/util/ConcurrentWeakIdentityHashMap $WeakReference настолько плох.
Pull Rquest для исправления ehcache3 ConcurrentWeakIdentityHashMap Key hashCode