Java WeakHashMap

Tässä opetusohjelmassa opitaan Java WeakHashMapista ja sen toiminnoista esimerkkien avulla. Opimme myös WeakHashMapin ja HashMapin eroista

WeakHashMapLuokka Java kokoelmien politiikalle piirre hajautustaulukossa tietorakenteen …

Se toteuttaa Map-käyttöliittymän.

Huomaa : Heikon hashmap-avaimet ovat WeakReference- tyyppiä.

Heikon viitetyypin kohde voi olla Java: ssa kerätty roska, jos viittausta ei enää käytetä ohjelmassa.

Oppikaamme ensin luomaan heikko hash-kartta. Sitten opimme, kuinka se eroaa hashmapista.

Luo WeakHashMap

Heikon hashmapin luomiseksi meidän on java.util.WeakHashMapensin tuotava paketti. Kun paketti on tuotu, voimme näin luoda heikkoja hashappeja Javalaan.

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

Yllä olevassa koodissa olemme luoneet heikon hashmap-nimisen numeron.

Tässä,

  • Avain - yksilöllinen tunniste, jota käytetään kunkin elementin (arvon) liittämiseen karttaan
  • Arvo - elementit, jotka on liitetty avaimiin kartalla

Huomaa osa new WeakHashMap(8, 0.6). Ensimmäinen parametri on kapasiteetti ja toinen parametri loadFactor .

  • kapasiteetti - Tämän kartan kapasiteetti on 8. Tämä tarkoittaa, että se voi tallentaa 8 merkintää.
  • loadFactor - Tämän kartan kuormituskerroin on 0,6. Tämä tarkoittaa sitä, että aina kun hajautustaulukomme täytetään 60%, merkinnät siirretään uuteen hajautustaulukkoon, joka on kaksinkertainen alkuperäisen hajataulukon kokoon nähden.

Oletuskapasiteetti ja kuormituskerroin

On mahdollista luoda heikko hashmap määrittelemättä sen kapasiteettia ja kuormituskerrointa. Esimerkiksi,

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

Oletuksena,

  • kartan kapasiteetti on 16
  • kuormituskerroin on 0,75

Erot HashMapin ja WeakHashMapin välillä

Katsotaanpa heikon hashmapin toteutus Java-sovelluksessa.

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

Tuotos

 WeakHashMap: (Neljä = 4, Kaksi = 2) WeakHashMap roskien keräämisen jälkeen: (Neljä) 

Kuten näemme, kun heikon hashapin avain kaksi asetetaan nullroskakoriin ja suoritetaan se, avain poistetaan.

Tämä johtuu siitä, että toisin kuin hashmaps, heikkojen hashmaps-näppäimien tyyppi on heikko . Tämä tarkoittaa, että roskien kerääjä poistaa kartan merkinnän, jos kyseisen merkinnän avainta ei enää käytetä. Tämä on hyödyllistä resurssien säästämiseksi.

Katsotaan nyt sama toteutus hashmapissa.

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

Tuotos

 HashMap: (Neljä = 4, Kaksi = 2) HashMap roskien keräämisen jälkeen: (Neljä = 4, Kaksi = 2) 

Täällä, kun hashmap-näppäimen kaksi avain asetetaan nullja suoritetaan roskakoriin, avainta ei poisteta.

Tämä johtuu siitä, että toisin kuin heikot hashmaps-avaimet, hashmaps-näppäimet ovat vahvoja viitteitä . Tämä tarkoittaa, että roskien kerääjä ei poista kartan merkintää, vaikka kyseisen merkinnän avainta ei enää käytetä.

Huomaa : Kaikki hashmapsin ja heikkojen hashmapsin toiminnot ovat samanlaisia, paitsi että heikon hashmapin näppäimillä on heikko viittaus, kun taas hashmap-näppäimillä on vahva viite.

WeakHashMapin luominen muista kartoista

Näin voimme luoda heikon hashmapin muista kartoista.

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

Tuotos

 HashMap: (Kaksi = 2) WeakHashMap: (Kaksi = 2) 

WeakHashMap-menetelmät

WeakHashMapLuokan tarjoaa menetelmiä, joiden avulla voimme suorittaa erilaisia toimenpiteitä kartalle.

Lisää elementit WeakHashMapiin

  • put() - lisää määritetyn avaimen / arvon kartoituksen kartalle
  • putAll() - lisää kaikki määritetyn kartan merkinnät tähän karttaan
  • putIfAbsent() - lisää määritetyn avaimen / arvon kartoituksen, jos määritettyä avainta ei ole kartalla

Esimerkiksi,

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

Tuotos

 Parillisten numeroiden WeakHash: (neljä = 4, kaksi = 2) WeakHashMap-numero: (kaksi = 2, neljä = 4, yksi = 1) 

Käytä WeakHashMap-elementtejä

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: (Kaksi = 2, Yksi = 1) Poistettu arvo: 2 Onko merkintä (Yksi = 3) poistettu? Väärin päivitetty WeakHashMap: (Yksi = 1)

Muut WeakHashMap-menetelmät

Menetelmä Kuvaus
clear() Poistaa kaikki merkinnät kartalta
containsKey() Tarkistaa, sisältääkö kartta määritetyn avaimen ja palauttaa loogisen arvon
containsValue() Tarkistaa, sisältääkö kartta määritetyn arvon ja palauttaa loogisen arvon
size() Palauttaa kartan koon
isEmpty() Tarkistaa, onko kartta tyhjä, ja palauttaa loogisen arvon

Lisätietoja on Java WeakHashMap -sivustossa (virallinen Java-dokumentaatio).

Mielenkiintoisia artikkeleita...