Sunday, April 23, 2023

What is WeakHashMap in Java? HashMap vs WeakHashMap Example Tutorial

Hello friends, we are here today again on our journey to Java. I hope everyone is fine and ready to board our train of knowledge. Today we are gonna learn something very interesting and very exciting. Today's topic will definitely be very useful in coding and programming. This topic would surely decrease your time complexity, and space requirements for any task very significantly :p So what's the wait? Let's start!

As always, we will start understanding today's topic by a scenario. But, before that, you guys must know what a HashMap is. So, go through the HashMap article before jumping on this one, and you will get a better understanding of today's article. For the guys who have already gone through HashMap before, let me give a brief intro and what a HashMap is so we all can refresh the topic easily.


1. HashMap:
The Java HashMap implementation of the Map interface is based on hash tables. A Map is a set of key-value pairs, as you may know. It converts keys into values.
  • There can't be any duplicate keys in a HashMap.
  • Null values and the null keys are allowed in Java HashMap.
  • HashMap is a collection that is not in any particular order. It does not ensure that the elements will be in any certain sequence.
  • HashMap in Java is not thread-safe. You must explicitly synchronize concurrent HashMap changes.

HashMap is declared as:

Map<String, Integer> map = new HashMap<>();


Now, after you guys know what HashMap is, let's jump into today's topic with a scenario.



Let's say we have a HashMap with us. 

The HashMap has a String key type and the value type is Integer. Let's say we have unique car names as key and value is the max speed limit of the cars.

So, the HashMap would look like this:
Map<String,Integer> carMap = new HashMap<>();

The values inside the map would be similar to this: {'BMW m3' - 360, 'Audi a6 - 340', 'Mercedes q3 - 320', 'Bugatti Veyron - 420'}. This represents the {'key' - value} notation. Each key is linked to its value. Now, suppose this list grows on and the records are now in millions! 

This would end up consuming all our space and we would get a StackOverflowError anytime! For obvious reasons, we don't want that. So, let's see how out today's topic is relevant to it and then you guys can yourself take care of the solution to the above problem.




What is WeakHashMap in Java?

WeakHashMap is a Map interface implementation that only holds weak references to its keys. When a key-value pair is only stored as weak references, it may be garbage-collected when its key is no longer referenced outside of the WeakHashMap.

This class makes it simple to take advantage of the power of weak references. It's helpful for creating "registry-like" data structures, in which an entry's utility disappears when its key is no longer accessible by any thread.

The WeakHashMap is similar to the HashMap except for one crucial difference: if the Java memory manager no longer holds a strong reference to the object given as a key, the item in the map is deleted.



Also, the Javadocs gave an explicit implementation note for WeakHashMap.In a WeakHashMap, the value objects are kept by regular strong references. As a result, value objects should be careful not to make strong references to their own keys, either directly or indirectly, as this will prevent the keys from being destroyed. 

It's worth noting that a value object can indirectly refer to its key through the WeakHashMap; that is, a value object can strongly refer to another key object, whose associated value object, in turn, strongly refers to the key of the first value object. 

If the values in the map do not rely on the map having strong references to them, wrapping the values in WeakReferences before inserting is one solution.





3. How to use WeakHashMap in Java? Coding Example

Now that you guys have an understanding of what a WeakHashMap is, let's see its code and how it is implemented.



import java.util.Map;
import java.util.WeakHashMap;

public class MyMap {
public static void main(String[] args) {
Map<String, Integer> map = new WeakHashMap<>();
map.put("Student1", 1);
map.put("Tom Cruise", 3);
map.put("Bond, James Bond", 7);
map.put("Selmon Bhoi", 0);
map.put(null, 9);


System.out.println("getting values from map now...");

System.out.println(map.get("Selmon Bhoi"));
System.out.println(map.get("Tom Cruise"));
System.out.println(map.get(null));

}
}

              

Output:



Now, you guys must be wondering that this is same as HashMap. What is the difference? The difference we cannot observe here because it is a very small program. The System will not garbage collect as there is plenty of memory available.

But, in scenarios of memory shortage, system will garbage collect the unused keys. You guys can try out with hands-on for this and using system.gc() which calls the garbage collection utility. Still, there's no guarantee that garbage collection will be performed by system.


Now, you guys will be thinking that when to use WeakHashMap. The garbage collector can recover elements in a weak hashmap if there are no other strong references to the key object; this makes them handy for caches and lookup storage.

Weak references aren't just for hash tables; they may also be used for single objects. They're helpful for conserving resources since they enable you to maintain a reference to something while allowing it to be collected when no one else refers to it. 

By the way, a strong reference is just a regular Java reference.) Weak references are less easily gathered than soft references (which don't tend to stick around for long after the last strong reference has vanished).


Related Java HashMap tutorials  you may like
  • How does get() method of HashMap work in Java? (answer)
  • 40 HashMap Interview Questions with answers (hashmap questions)
  • Difference between HashMap and Hashtable in Java? (answer)
  • 25 ConcurrentHashMap Example in Java (concurrenthashmap examples)
  • Difference between ArrayList and HashMap in Java? (answer)
  • Difference between HashSet and HashMap in Java? (answer)
  • Difference between ConcurrentHashMap and HashMap in Java? (answer)
  • How HashSet internally works in Java? (answer)
  • How ConcurrentHashMap internally works in Java? (answer)
  • The difference between HashMap and LinkedHashMap in Java? (answer)
  • The best way to iterate over HashMap in Java? (answer)
  • How to sort the HashMap on keys and values in Java? (solution)
  • 3 ways to loop over a Map in Java? (example)
  • The difference between HashMap and ConcurrentHashMap in Java? (answer)
  • What is the difference between ArrayList and HashMap? (difference)
  • How to convert Map to List in Java? (solution)

Thanks for reading this article so far. If you like this HashMap article then please share with your friends and colleagues. If you have any questions or feedback, please ask in comments. 

P. S. - If you are new to Java and want to learn core Java in depth, you can also checkout these 10 Free Core Java Courses to start with. It contains best free Java courses from Udemy and Coursera for beginners. 

No comments:

Post a Comment

Feel free to comment, ask questions if you have any doubt.