2016-03-09 2 views
2
HashMap<StringBuilder, StringBuilder> aMap = new 
     HashMap<StringBuilder, StringBuilder>(); 

StringBuilder emp = new StringBuilder("Stack"); 
StringBuilder val = new StringBuilder("Programmer"); 

aMap.put(emp, val); 
emp = new StringBuilder("sss"); 
System.out.println(aMap);` 

Хотя значение emp значение chnaged, оно не отражается в HashMap. Это потому, что HashMap использует какой-то конструктор копий при добавлении нового значения?HashMap - Значение ключа изменения

Сейчас подходит к WeakHashMap:

WeakHashMap<StringBuilder, StringBuilder> aMap1 = 
      new WeakHashMap<StringBuilder, StringBuilder>(); 
    StringBuilder emp1 = new StringBuilder("WeakStack"); 
    StringBuilder val1 = new StringBuilder("Programmer"); 
aMap1.put(emp1, val1); 
emp1 = new StringBuilder("WeakStack1"); 

После некоторых GC вызовов aMap1 становится пустой. Почему так? Это потому, что ключ, указывающий на, больше не существует?

Обновление: Я понимаю из ответов, что ключ ссылочных из HashMap, поэтому при emp (изменяемый ключ) в выше HashMap изменяется путем добавления строки в ней, как emp.append("changed"), она отражает в HashMap. То же самое верно для WeakHashMap (если измененный ключ изменен/обновлен, это отражается). Это означает, что на этот ключ ссылаются от WeakHashMap.

Может ли кто-нибудь объяснить, что такое WeakHashMap реализация, отличающаяся тем, что ключ может быть собран из мусора, хотя на него ссылаются?

Спасибо.

ответ

2

emp = new StringBuilder("sss"); не влияет на запись, которая уже в HashMap (созданной в заявлении new StringBuilder("Stack");), так как HashMap содержит свою собственную ссылку на StringBuilder экземпляр, который был первоначально отнесен emp. Он не создает копию экземпляра StringBuilder, он сохраняет только копию ссылки.

С другой стороны, с WeakHashMap наличие ключа в WeakHashMap не мешает ему собирать мусор, поэтому, если нет другой ссылки на ключ, который вы положили на карту, GC может освободить этот экземпляр. Поэтому после того, как вы назначили новый экземпляр emp1, только карта содержит ссылку на исходный экземпляр, на который она ссылается, и GC может ее освободить.

Вот соответствующая ссылка Javadoc:

Запись в WeakHashMap будет автоматически удален, если его ключ уже не в обычном использовании. Точнее, наличие отображения для данного ключа не помешает ключ от отбрасываются сборщиком мусора

EDIT:

А как реализация WeakHashMap отличается, Entry из WeakHashMap extends WeakReference<Object>, который является экземпляром, который ссылается на другой экземпляр (ключ записи в этом случае) и не мешает его референту быть освобожденным GC.

+0

Спасибо! Теперь я понимаю. У меня есть еще один вопрос. См. Обновление – user2296988

+1

@ user2296988. Читайте о 'WeakReference' для более подробной информации. – Eran

0

Для первого вопроса вы можете посмотреть на него как на принтер. Вы создаете изображение в какой-то программе и распечатываете его на листе бумаги. Теперь вы меняете изображение в программе, но не распечатываете его. 2 изображения разные. Зачем? Потому что вы не распечатывали изменения.

То же самое касается HashMap. Вы создали Object и поместите его на карту.Вы снова изменили Object, но он не изменился в HashMap. Зачем? Просто потому, что вы не применяли изменения.

Смежные вопросы