Класс WeakHashMap – это реализация интерфейса Map, в котором хранятся только слабые ссылки на его ключи. Хранение только слабых ссылок позволяет собрать пару с ключом-значением, когда его ключ больше не ссылается за пределы WeakHashMap.

Этот класс обеспечивает самый простой способ использовать силу слабых ссылок. Он полезен для реализации структур данных, подобных реестру, где утилита записи исчезает, когда ее ключ больше недоступен для любого потока.

Функции WeakHashMap в Java идентичны HashMap с одним очень важным исключением: если диспетчер памяти Java больше не имеет сильной ссылки на объект, указанный в качестве ключа, то запись на Map будет удалена.

Слабая ссылка. Если единственными ссылками на объект являются слабые ссылки, сборщик мусора может вернуть память объекта в любое время. Ему не нужно ждать, пока система исчерпает память. Обычно он будет освобожден при следующем запуске сборщика мусора.

Конструкторы

Ниже приведен список конструкторов, поддерживаемых классом WeakHashMap.

Конструктор и описание
1WeakHashMap()
Этот конструктор создает новую, пустую WeakHashMap с начальной начальной емкостью (16) и коэффициентом загрузки по умолчанию (0.75).
2WeakHashMap(int initialCapacity)
Этот конструктор создает новую пустую WeakHashMap с заданной начальной емкостью и коэффициентом загрузки по умолчанию, который равен 0,75.
3WeakHashMap(int initialCapacity, float loadFactor)
Этот конструктор создает новую пустую WeakHashMap с заданной начальной емкостью и заданным коэффициентом загрузки.
4WeakHashMap(Map t)
Этот конструктор создает новый WeakHashMap с теми же сопоставлениями, что и указанный Map.

Методы

Помимо методов, унаследованных от его родительских классов, TreeMap определяет следующие методы:

Методы и описание
1void clear()
Удаляет все отображения с этого Map.
2boolean containsKey(Object key)
Возвращает true, если этот Map содержит отображение для указанного ключа.
3boolean containsValue(Object value)
Возвращает true, если этот Map отображает один или несколько ключей в указанное значение.
4Set entrySet()
Возвращает представление (вид) коллекции отображений, содержащихся в этом Map.
5Object get(Object key)
Возвращает значение, на котором указанный ключ отображается в этом WeakHashMap, или null (нуль), если Map не содержит сопоставления для этого ключа.
6boolean isEmpty()
Возвращает true, если этот Map не содержит отображений ключ-значение.
7Set keySet()
Возвращает Set представление (вид) ключей, содержащихся на этом Map.
8Object put(Object key, Object value)
Связывает указанное значение с указанным ключом на этой карте.
9void putAll(Map m)
Копирует все отображения с указанного Map на этот Map. Эти отображения заменят любые отображения, которые это отображение имело для любого из ключей, находящихся в настоящее время на указанном Map.
10Object remove(Object key)
Удаляет отображение этого ключа с этого Map, если оно присутствует.
11int size()
Возвращает количество отображений ключ-значение на этом Map.
12Collection values()
Возвращает представление (вид) коллекции значений, содержащихся на этом Map.

Пример

Следующая программа демонстрирует работу нескольких методов, поддерживаемых WeakHashMap в Java:

import java.util.*;
public class WeakHashMap_Demo {

   private static Map map;
   public static void main (String args[]) {
      map = new WeakHashMap();
      map.put(new String("Брест"), "Минск");
      
      Runnable runner = new Runnable() {
         public void run() {
            while (map.containsKey("Брест")) {
               try {
                  Thread.sleep(500);
               } catch (InterruptedException ignored) {
               }
               System.out.println("Ожидание потока");
               System.gc();
            }
         }
      };
      Thread t = new Thread(runner);
      t.start();
      System.out.println("Главное ожидание");
      try {
         t.join();
      } catch (InterruptedException ignored) {
      }
   }
}

Получим следующий результат:

Главное ожидание
Ожидание потока

Если вы не включили вызов System.gc(), система может никогда не запускать сборщик мусора, поскольку программа использует не так много памяти. Для более активной программы вызов будет ненужным.

Оглавление