Подтвердить что ты не робот

ConcurrentHashMap со слабыми ключами и хэш-идентификатором?

Как получить ConcurrentHashMap со слабыми ключами и хэшами идентификации в Java? Я думаю, что Google Guava Collections может дать такую ​​вещь, но могу ли я получить ее из стандартной библиотеки? Какие еще варианты у меня есть?

4b9b3361

Ответ 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.