Java WeakHashMap

Σε αυτό το σεμινάριο, θα μάθουμε για το Java WeakHashMap και τις λειτουργίες του με τη βοήθεια παραδειγμάτων. Θα μάθουμε επίσης για τις διαφορές μεταξύ WeakHashMap και HashMap

Η WeakHashMapκλάση του πλαισίου συλλογών Java παρέχει τη δυνατότητα της δομής δεδομένων πίνακα κατακερματισμού…

Εφαρμόζει τη διασύνδεση χάρτη.

Σημείωση : Τα κλειδιά του αδύναμου κατακερματισμού είναι τύπου WeakReference .

Το αντικείμενο ενός αδύναμου τύπου αναφοράς μπορεί να συλλέγεται σκουπίδια στην Java εάν η αναφορά δεν χρησιμοποιείται πλέον στο πρόγραμμα.

Ας μάθουμε να δημιουργούμε πρώτα έναν αδύναμο κατακερματισμό. Στη συνέχεια, θα μάθουμε πώς διαφέρει από έναν κατακερματισμό.

Δημιουργήστε ένα WeakHashMap

Για να δημιουργήσουμε έναν ασθενή κατακερματισμό, πρέπει java.util.WeakHashMapπρώτα να εισαγάγουμε το πακέτο. Μόλις εισαγάγουμε το πακέτο, εδώ είναι πώς μπορούμε να δημιουργήσουμε αδύναμους κατακερματισμούς στην Java.

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

Στον παραπάνω κώδικα, έχουμε δημιουργήσει ένα αδύναμο hashmap με όνομα.

Εδώ,

  • Κλειδί - ένα μοναδικό αναγνωριστικό που χρησιμοποιείται για τη συσχέτιση κάθε στοιχείου (τιμή) σε έναν χάρτη
  • Τιμή - στοιχεία που σχετίζονται με κλειδιά σε έναν χάρτη

Παρατηρήστε το μέρος new WeakHashMap(8, 0.6). Εδώ, η πρώτη παράμετρος είναι χωρητικότητα και η δεύτερη παράμετρος είναι loadFactor .

  • Χωρητικότητα - Η χωρητικότητα αυτού του χάρτη είναι 8. Δηλαδή, μπορεί να αποθηκεύσει 8 καταχωρήσεις.
  • loadFactor - Ο συντελεστής φόρτωσης αυτού του χάρτη είναι 0,6. Αυτό σημαίνει ότι κάθε φορά που ο πίνακας κατακερματισμού συμπληρώνεται κατά 60%, οι εγγραφές μεταφέρονται σε έναν νέο πίνακα κατακερματισμού διπλάσιου μεγέθους από τον αρχικό πίνακα κατακερματισμού.

Προεπιλεγμένη χωρητικότητα και συντελεστής φόρτωσης

Είναι δυνατό να δημιουργήσετε ένα αδύναμο hashmap χωρίς να ορίσετε τη χωρητικότητα και τον συντελεστή φόρτωσης. Για παράδειγμα,

 // 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: (Four = 4, Two = 2) WeakHashMap μετά τη συλλογή απορριμμάτων: (Four) 

Όπως μπορούμε να δούμε, όταν το κλειδί δύο ενός αδύναμου κατακερματισμού έχει οριστεί 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: (Four = 4, Two = 2) HashMap μετά τη συλλογή απορριμμάτων: (Four = 4, Two = 2) 

Εδώ, όταν το κλειδί δύο του κατακερματισμού έχει οριστεί nullκαι εκτελεί συλλογή απορριμμάτων, το κλειδί δεν αφαιρείται.

Αυτό συμβαίνει επειδή, σε αντίθεση με τα αδύναμα hashmaps, τα κλειδιά hashmaps είναι ισχυρού τύπου αναφοράς . Αυτό σημαίνει ότι η καταχώριση ενός χάρτη δεν αφαιρείται από τον συλλέκτη απορριμμάτων παρόλο που το κλειδί για αυτήν την καταχώριση δεν χρησιμοποιείται πλέον.

Note: All functionalities of hashmaps and weak hashmaps are similar except keys of a weak hashmap are of weak reference, whereas keys of a hashmap are of strong reference.

Creating WeakHashMap from Other Maps

Here is how we can create a weak hashmap from other maps.

 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); ) ) 

Output

 HashMap: (Two=2) WeakHashMap: (Two=2) 

Methods of WeakHashMap

The WeakHashMap class provides methods that allow us to perform various operations on the map.

Insert Elements to WeakHashMap

  • put() - inserts the specified key/value mapping to the map
  • putAll() - inserts all the entries from specified map to this map
  • putIfAbsent() - inserts the specified key/value mapping to the map if the specified key is not present in the map

For example,

 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); ) ) 

Output

 WeakHashMap of even numbers: (Four=4, Two=2) WeakHashMap of numbers: (Two=2, Four=4, One=1) 

Access WeakHashMap Elements

1. Using entrySet(), keySet() and values()

  • entrySet() - returns a set of all the key/value mapping of the map
  • keySet() - returns a set of all the keys of the map
  • values() - returns a set of all the values of the map

For example,

 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()); ) ) 

Output

 WeakHashMap: (Two=2, One=1) Key/Value mappings: (Two=2, One=1) Keys: (Two, One) Values: (1, 2) 

2. Using get() and getOrDefault()

  • get() - Returns the value associated with the specified key. Returns null if the key is not found.
  • getOrDefault() - Returns the value associated with the specified key. Returns the specified default value if the key is not found.

For example,

 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); ) ) 

Output

 WeakHashMap: (Two=2, One=1) Using get(): 2 Using getOrDefault(): 4 

Remove WeakHashMap Elements

  • remove(key) - returns and removes the entry associated with the specified key from the map
  • remove(key, value) - removes the entry from the map only if the specified key mapped to the specified value and return a boolean value

For example,

 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); ) ) 

Output

WeakHashMap: (Two = 2, One = 1) Αφαιρούμενη τιμή: 2 Καταργήθηκε η καταχώριση (One = 3); False Update WeakHashMap: (Ένα = 1)

Άλλες μέθοδοι του WeakHashMap

Μέθοδος Περιγραφή
clear() Καταργεί όλες τις εγγραφές από το χάρτη
containsKey() Ελέγχει εάν ο χάρτης περιέχει το καθορισμένο κλειδί και επιστρέφει μια δυαδική τιμή
containsValue() Ελέγχει εάν ο χάρτης περιέχει την καθορισμένη τιμή και επιστρέφει μια δυαδική τιμή
size() Επιστρέφει το μέγεθος του χάρτη
isEmpty() Ελέγχει εάν ο χάρτης είναι κενός και επιστρέφει μια δυαδική τιμή

Για να μάθετε περισσότερα, επισκεφθείτε το Java WeakHashMap (επίσημη τεκμηρίωση Java).

ενδιαφέροντα άρθρα...