2015-10-10 4 views
4

Я проходил через WeakHashMap в Java. И то, что я понял, является WeakHashMap точно так же, как HashMap, за исключением его ключевых ссылок WeakReference. Это означает, что ссылки на ключевые слова имеют право на gc, и когда он будет сфальсифицирован, его запись будет удалена с карты. Это не доступно в HashMap. Пожалуйста, поправьте меня, если я ошибаюсь.Могу я использовать WeakHashMap вместо HashMap

У меня есть один вопрос здесь.

Теперь в будущем Если я получу требование о том, что мне нужно использовать карту для ввода ключа и значения, могу ли я пойти вперед с WeakHashMap? Или мне нужно рассмотреть любой сценарий, где WeakHashMap не будет соответствовать только HashMap подойдет?

+3

Вы понимаете, что означает WeakReference? И когда именно он станет подходящим для GC? Вы не можете просто заменить все HashMaps на WeakHashMaps ... У них обоих разные поведения ... – Codebender

+6

См. Также [Когда вы используете WeakHashMap или WeakReference?] (Http://stackoverflow.com/questions/154724/when-would -you-use-a-weakhashmap-or-a-weakreference) и [Что такое WeakHashMap и когда его использовать?] (http://stackoverflow.com/questions/5511279/what-is-a-weakhashmap-and -Когда в использовании этого) –

ответ

1

Есть случаи, когда WeakHashMap не заменит HashMap, например:

  1. При вызове API, где аргумент типа является конкретным типом HashMap<K, V>, а не типом интерфейса Map<K, V>.
  2. Когда ваш код не принимает ничего другого, он меняет карту из-под нее. Сборщик мусора может удалить слабые ключи в любое время, заставив методы WeakHashMap действовать так, как если бы записи были удалены именно тогда. Так, например, если вы поместите размер карты в переменную, фактическая карта может быть меньше, чем при ее перечислении. (См. Примеры JavaDoc.) Очень сложно передать файл WeakHashMap в код, который не может быть подготовлен к таким изменениям. Синхронизация не поможет.
  3. Если вы не хотите лишних накладных расходов в пространстве и времени.

Я рекомендую использовать WeakHashMap только тогда, когда вам нужно (например, реестр прослушивателя), и только тогда, когда весь код, который его касается, явно подготовлен к исчезновению записей.

2

Вам нужно рассмотреть контекст, чтобы решить, правильно ли использовать/безопасно использовать WeakHashMap.

Вот пример, в котором WeakHashMap не будет работать (псевдокод)

Map<Name, Details> map = ... 
do for ever: 
    name = get name from user 
    if lookup: 
     details = map.get(name) 
     display details 
    else if create: 
     details = get details from user 
     map.add(name, details) 

С WeakHashMap, существует риск того, что данные будут выпадать из таблицы, и поиски пользователя будут терпеть неудачу. С HashMap нет риска.


Существует также проблема, что WeakReference и все, что на ней построено, дороже обычных ссылок. Они используют больше пространства и времени. Более того, классы Reference подвергаются накладным расходам каждый раз, когда GC сталкивается с ними, что может увеличить время паузы GC.

Однако вопрос о накладных расходах во время выполнения должен обычно быть вторичным по отношению к проблеме правильности.

  • Если вы используете HashMap, когда вы должны использовать WeakHashMap, то Вы обязаны столкнуться с проблемами при заполнении вашей кучи. И это также имеет проблемы с производительностью.

  • Если вы используете WeakHashMap, где вы должны использовать HashMap, вы можете потерять информацию.