Java WeakHashMap

В този урок ще научим за Java WeakHashMap и нейните операции с помощта на примери. Също така ще научим за разликите между WeakHashMap и HashMap

В WeakHashMapкласа на колекции рамките на Java осигурява функцията на структурата на данните на хеш-таблица …

Той реализира интерфейса Map.

Забележка : Клавишите на слабата хеш-карта са от типа WeakReference .

Обектът на слаб референтен тип може да бъде боклук, събран в Java, ако препратката вече не се използва в програмата.

Нека се научим първо да създаваме слаба хеш карта. След това ще научим как се различава от хеш-картата.

Създайте WeakHashMap

За да създадем слаба хеш-карта, първо трябва да импортираме java.util.WeakHashMapпакета. След като импортираме пакета, ето как можем да създадем слаби хеш-карти в Java.

 //WeakHashMap creation with capacity 8 and load factor 0.6 WeakHashMap numbers = new WeakHashMap(8, 0.6); 

В горния код създадохме слаба хеш-карта с имена числа.

Тук,

  • Ключ - уникален идентификатор, използван за свързване на всеки елемент (стойност) в карта
  • Стойност - елементи, свързани с ключове в карта

Забележете частта new WeakHashMap(8, 0.6). Тук първият параметър е капацитет, а вторият параметър е loadFactor .

  • капацитет - Капацитетът на тази карта е 8. Значение, тя може да съхранява 8 записа.
  • loadFactor - Коефициентът на натоварване на тази карта е 0,6. Това означава, че когато нашата хеш таблица се запълни с 60%, записите се преместват в нова хеш таблица с двоен размер на оригиналната хеш таблица.

Капацитет по подразбиране и коефициент на натоварване

Възможно е да се създаде слаба хеш-карта, без да се дефинира нейният капацитет и фактор на натоварване. Например,

 // WeakHashMap with default capacity and load factor WeakHashMap numbers1 = new WeakHashMap(); 

По подразбиране,

  • капацитетът на картата ще бъде 16
  • коефициентът на натоварване ще бъде 0,75

Разлики между HashMap и WeakHashMap

Нека да видим прилагането на слаба хеш-карта в Java.

 import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of numbers WeakHashMap numbers = new WeakHashMap(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; // Inserting elements numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("WeakHashMap: " + numbers); // Make the reference null two = null; // Perform garbage collection System.gc(); System.out.println("WeakHashMap after garbage collection: " + numbers); ) ) 

Изход

 WeakHashMap: (Четири = 4, Две = 2) WeakHashMap след събирането на боклука: (Четири) 

Както виждаме, когато ключовите две от слаба хеш-карта са настроени nullи извършват събиране на боклук, ключът се премахва.

Това е така, защото за разлика от hashmaps, ключовете на слабите hashmaps са от слаб референтен тип. Това означава, че записът на карта се премахва от събирача на боклук, ако ключът към този запис вече не се използва. Това е полезно за спестяване на ресурси.

Сега нека видим същото изпълнение в хеш-карта.

 import java.util.HashMap; class Main ( public static void main(String() args) ( // Creating HashMap of even numbers HashMap numbers = new HashMap(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; // Inserting elements numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("HashMap: " + numbers); // Make the reference null two = null; // Perform garbage collection System.gc(); System.out.println("HashMap after garbage collection: " + numbers); ) ) 

Изход

 HashMap: (Четири = 4, Две = 2) HashMap след събирането на боклука: (Четири = 4, Две = 2) 

Тук, когато ключът две на hashmap е зададен nullи извършва събиране на боклук, ключът не се премахва.

Това е така, защото за разлика от слабите hashmaps ключовете на hashmaps са от силен референтен тип. Това означава, че въвеждането на карта не се премахва от събирача на боклук, въпреки че ключът към този запис вече не се използва.

Забележка : Всички функционалности на хеш-карти и слаби хеш-карти са сходни, с изключение на ключовете на слаба хеш-карта са със слаба препратка, докато ключовете на хеш-карта са със силна препратка.

Създаване на WeakHashMap от други карти

Ето как можем да създадем слаба хеш-карта от други карти.

 import java.util.HashMap; import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating a hashmap of even numbers HashMap evenNumbers = new HashMap(); String two = new String("Two"); Integer twoValue = 2; evenNumbers.put(two, twoValue); System.out.println("HashMap: " + evenNumbers); // Creating a weak hash map from other hashmap WeakHashMap numbers = new WeakHashMap(evenNumbers); System.out.println("WeakHashMap: " + numbers); ) ) 

Изход

 HashMap: (Две = 2) WeakHashMap: (Две = 2) 

Методи на WeakHashMap

Най- WeakHashMapкласа предлага методи, които ни позволяват да изпълняват различни операции върху картата.

Вмъкване на елементи в WeakHashMap

  • put() - вмъква посоченото картографиране на ключ / стойност на картата
  • putAll() - вмъква всички записи от определена карта в тази карта
  • putIfAbsent() - вмъква посоченото картографиране на ключ / стойност в картата, ако посоченият ключ не присъства в картата

Например,

 import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap evenNumbers = new WeakHashMap(); String two = new String("Two"); Integer twoValue = 2; // Using put() evenNumbers.put(two, twoValue); String four = new String("Four"); Integer fourValue = 4; // Using putIfAbsent() evenNumbers.putIfAbsent(four, fourValue); System.out.println("WeakHashMap of even numbers: " + evenNumbers); //Creating WeakHashMap of numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); // Using putAll() numbers.putAll(evenNumbers); System.out.println("WeakHashMap of numbers: " + numbers); ) ) 

Изход

 WeakHashMap на четни числа: (Четири = 4, Две = 2) WeakHashMap на числа: (Две = 2, Четири = 4, Едно = 1) 

Достъп до елементите на WeakHashMap

1. Използване на entrySet (), keySet () и стойности ()

  • entrySet() - връща набор от всички съпоставяния ключ / стойност на картата
  • keySet() - връща набор от всички ключове на картата
  • values() - връща набор от всички стойности на картата

Например,

 import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // Using entrySet() System.out.println("Key/Value mappings: " + numbers.entrySet()); // Using keySet() System.out.println("Keys: " + numbers.keySet()); // Using values() System.out.println("Values: " + numbers.values()); ) ) 

Изход

 WeakHashMap: (Two = 2, One = 1) Съпоставяне на ключ / стойност: (Two = 2, One = 1) Клавиши: (Two, One) Стойности: (1, 2) 

2. Използване на get () и getOrDefault ()

  • get()- Връща стойността, свързана с посочения ключ. Връща, nullако ключът не е намерен.
  • getOrDefault()- Връща стойността, свързана с посочения ключ. Връща посочената стойност по подразбиране, ако ключът не е намерен.

Например,

 import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // Using get() int value1 = numbers.get("Two"); System.out.println("Using get(): " + value1); // Using getOrDefault() int value2 = numbers.getOrDefault("Four", 4); System.out.println("Using getOrDefault(): " + value2); ) ) 

Изход

 WeakHashMap: (Две = 2, Едно = 1) Използване на get (): 2 Използване на getOrDefault (): 4 

Премахнете елементите на WeakHashMap

  • remove(key) - връща и премахва записа, свързан с посочения ключ, от картата
  • remove(key, value) - премахва записа от картата само ако посоченият ключ се съпостави с посочената стойност и върне булева стойност

Например,

 import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // Using remove() with single parameter int value = numbers.remove("Two"); System.out.println("Removed value: " + value); // Using remove() with 2 parameters boolean result = numbers.remove("One", 3); System.out.println("Is the entry (One=3) removed? " + result); System.out.println("Updated WeakHashMap: " + numbers); ) ) 

Изход

WeakHashMap: (Two = 2, One = 1) Премахната стойност: 2 Премахнат ли е записът (One = 3)? Фалшиво актуализирана WeakHashMap: (One = 1)

Други методи на WeakHashMap

Метод Описание
clear() Премахва всички записи от картата
containsKey() Проверява дали картата съдържа посочения ключ и връща булева стойност
containsValue() Проверява дали картата съдържа посочената стойност и връща булева стойност
size() Връща размера на картата
isEmpty() Проверява дали картата е празна и връща булева стойност

За да научите повече, посетете Java WeakHashMap (официална документация за Java).

Интересни статии...