This Comprehensive Java Map Tutorial Covers how to Create, Initialize, and Iterate through Maps. You will also learn about Map Methods and Implementation Examples:
You will get to know the basics of map interface, methods supported by map interface, and other specific terms related to map interface.
Maps collection in Java is a collection that maps a key to a value. It is a collection consisting of keys and values. Each entry in the map consists of a key with its corresponding value. The keys are unique in maps. Maps can be used typically when we need to modify a collection based on a key value.
=> Check ALL Java Tutorials Here.
Table of Contents:
Maps In Java
The map in Java is a part of the java.util.map interface. The map interface is not a part of the collection interface and that is the reason for which maps are different from the other collections.
The general hierarchy of the map interface is shown below.
As shown above there are two interfaces to implement map i.e. map interface and sortedMap interface. There are three classes namely i.e. HashMap, TreeMap, and LinkedHashMap.
These map types are described below:
| Class | Description |
|---|---|
| LinkedHashMap | Extends from HashMap class. This map maintains the insertion order |
| HashMap | Implement a map interface. No order is maintained by HashMap. |
| TreeMap | Implements both map and sortedMap interface. TreeMap maintains an ascending order. |
Points To Remember About Maps.
- In maps, each key can map to the at most one value. Also, there cannot be duplicate keys in maps.
- Map implementations like HashMap and LinkedHashMap allow null key and null values. However, TreeMap does not allow it.
- A map cannot be traversed as it is. Hence for traversing, it needs to be converted to set using keyset () or entrySet () method.
Create A Map In Java
To create a map in Java, first, we have to include the interface in our program. We can use one of the following statements in the program to import the map functionality.
import java.util.*; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.TreeMap;
We need to instantiate a concrete implementation of the map as it is an interface.
The following statements create a map in Java.
Map hash_map = new HashMap(); Map tree_map = new TreeMap();
The above statements will create maps with default specifications.
We can also create generic maps specifying the types for both key and value.
Map<String, Object> myMap = new HashMap<String, Object>();
The above definition will have keys of type string and objects as values.
Initialize A Map In Java
It can be initialized using the following methods:
#1) Using Collections
Java Collections class has factory methods that can be used to initialize collections including maps.
Some methods used to initialize map are as follows:
(1) Collections.EmptyMap()
The Collections.EmptyMap () returns a serializable and immutable map that is empty. For example, the following line of code,
Map<String, String> myMap = Collections.EMPTY_MAP;
This will create an empty map. The above method may throw ‘unchecked assignment warning’ and thus we can also use the type-safe form as follows.
Map<String, String> myMap = Collections.emptyMap ();
(2) Collections.unModifiableMap()
The method unModifiableMap () takes another map as an argument and creates an unmodifiable view of the original map.
Map<String, String> myMap = Collections.EMPTY_MAP; Map<String, String> map_unmodifiable = Collections.unmodifiableMap (myMap);
(3) Collections.singletonMap()
Collections class also provides a factory method ‘singletonMap()’ that creates an immutable singleton map having only one entry.
Map<String, String> singleton_map = Collections.singletonMap("CHN", "Beijing");
#2) Using Java 8
We can obtain a stream of data from Java 8 stream API methods and construct maps using Collectors.
Some of the methods to construct maps are:
(1) Collectors.toMap()
We collect a stream and then use Collectors.toMap () method to construct a map.
Map<String, String> map = Stream.of(new String[][]{{"USA", "Washington"},
{"United Kingdom", "London"}
}).collect(Collectors.toMap(p -> p[0], p -> p[1]));
The above statement creates a map from the Java 8 stream.
(2) Collectors.collectingAndThen()
In this, we adapt the toMap () method that allows the collector to produce an immutable map using the collectingAndThen () method.
Map<String, String> immutableMap = Stream.of(new String[][]{
{"USA", "Washington"}, {"United Kingdom", "London”}
}).collect(Collectors.collectingAndThen(Collectors.toMap(p -> p [0], p -> p[1]),
Collections::<String, String>unmodifiableMap));
#3) Using the put method of the Map Interface
The put () method of the map interface can be used to assign initial values to maps.
#4) Using Double Brace Initialization
The technique “double brace initialization” creates an inner class. This class is anonymous and has an instance initializer in it. This is not a preferred technique and should be avoided as it may result in memory leaks or serialization problems.
The below program shows the various methods of initializing a map discussed above.
import java.util.*;
import java.util.stream.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String args[]) {
//using Collections
//create an empty map
Map<String, String> emptymap = Collections.EMPTY_MAP;
//create unmodifiable map using Collections
Map<String, String> unmodifiableMap = Collections.unmodifiableMap(emptymap);
System.out.println("unmodifiableMap map values:" + unmodifiableMap);
//singleton map
Map<Integer, String> singleton_map = Collections.singletonMap(10, " TEN");
System.out.println("\n\nsingleton_map Map values:" + singleton_map);
//using Java 8
//1. toMap method of collectors class
Map<String, String> map_cities = Stream.of(new String[][]{
{"MH", "Mumbai"}, {"CH", "Chennai"}, {"DL", "New Delhi"}
}).collect(Collectors.toMap(p -> p[0], p -> p[1]));
System.out.println("\n\nmap_cities values: " + map_cities);
//2. collectingAndThen method
Map<String, String> capitals_Map = Stream.of(new String[][]{
{"MAH", "Mumbai"}, {"GOA", "Panaji"}, {"KAR", "Bangaluru"}
}).collect(Collectors.collectingAndThen
(Collectors.toMap(p -> p[0], p -> p[1]),
Collections::<String, String>unmodifiableMap));
System.out.println("\n\ncapitals_Map values: " + capitals_Map);
//double brace initialization
Map<String, String> country_map = new HashMap<String, String>();
country_map.put("USA", "Washington");
country_map.put("UK", "London");
country_map.put("IND", "Delhi");
country_map.put("GER", "Berlin");
System.out.println("\n\nMap values:" + country_map);
}
}
Output:
unmodifiableMap map values:{}
singleton_map Map values:{10= TEN}
map_cities values: {CH=Chennai, DL=New Delhi, MH=Mumbai}
capitals_Map values: {MAH=Mumbai, GOA=Panaji, KAR=Bangaluru}
Map values:{USA=Washington, GER=Berlin, UK=London, IND=Delhi}
Iterate Over Map In Java And Print The Map
We can traverse the map just in the same way in which we traverse the other collections. In addition to traversing map entries, we can also traverse only the keys or only the values in the map. Note that to traverse a map, it needs to be converted to set first.
The following methods are used to traverse the map entries.
Using Entry Iterator
In this method, we obtain an entry iterator from an entry set. Then using the getKey and getValue methods, we retrieve the key-value pair for each map entry.
The following program shows the usage of an entry iterator.
import java.util.*;
import java.util.stream.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String args[]) {
//use toMap method of collectors class to populate the map
Map<String, String> map_cities = Stream.of(new String[][]{
{"MH", "Mumbai"},
{"CH", "Chennai"},
{"DL", "New Delhi"}
}).collect(Collectors.toMap(p -> p[0], p -> p[1]));
//transform map to set
Set<Map.Entry<String, String>> entries = map_cities.entrySet();
//declare an iterator
Iterator<Map.Entry<String, String>> iterator = entries.iterator();
System.out.println("The map entries are:");
System.out.println(" KEY VALUE");
//iterate and print key and value pairs.
while(iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
System.out.println("\t" + entry.getKey() + "\t" +entry.getValue());
}
}
}
Output:
The map entries are:
KEY VALUE
CH Chennai
DL New Delhi
MH Mumbai
In the above program, we obtain an entry iterator from the map using the entrySet method. Then we traverse the map using the hasNext () method of entry iterator and print the key-value pair.
Using An Entry for-each Loop
Here we traverse the entrySet using for-each loop and the implementation is shown below.
import java.util.*;
import java.util.stream.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String args[])
{
//use toMap method of collectors class to populate the map
Map<String, String> map_cities = Stream.of(new String[][]{
{"MH", "Mumbai"},
{"CH", "Chennai"},
{"DL", "New Delhi"}
}).collect(Collectors.toMap(p -> p[0], p -> p[1]));
System.out.println("The map entries are:");
System.out.println(" KEY VALUE");
//iterate using for each over entry set and print key and value pairs.
for(Map.Entry<String, String> entry : map_cities.entrySet()){
System.out.println("\t" + entry.getKey() + "\t" +entry.getValue());
}
}
}
Output:
The map entries are:
KEY VALUE
CH Chennai
DL New Delhi
MH Mumbai
Map Methods
Map interface in Java supports various operations similar to those supported by other collections. In this section, we will discuss the various methods provided by Map API in Java. As the scope of this tutorial is limited to introducing a map interface in general, we will not describe these methods.
We will discuss these methods in detail while discussing map interface classes.
The following table lists all the methods provided by map API.
| Method Name | Method Prototype | Description |
|---|---|---|
| get | V get(Object key) | Returns the object or value for the given key |
| put | V put(Object key, Object value) | Insert key-value entry in the map |
| putAll | void putAll(Map map) | Insert given map entries in the map. In other words copies or clones a map. |
| keySet | Set keySet() | Returns set view of the map. |
| entrySet | Set< Map.Entry< K,V >> entrySet() | Returns set the view for a given map |
| values | Collection values() | Returns collection view of the values in the map. |
| remove | V remove(Object key) | Delete a map entry for the given key |
| size | int size() | Returns number of entries in the map |
| clear | void clear() | Clears the map |
| isEmpty | boolean isEmpty() | Checks if the map is empty and returns true if yes. |
| containsValue | boolean containsValue(Object value) | Returns true if the map contains the value equal to the given value |
| containsKey | boolean containsKey(Object key) | Returns true if a given key exists in the map |
| equals | boolean equals(Object o) | Compares specified object o with the map |
| hashCode | int hashCode() | returns the hash code for the Map |
| forEach | void forEach(BiConsumer< ? super K,? super V > action) | Performs given action for each entry in the map |
| getOrDefault | V getOrDefault(Object key, V defaultValue) | Returns specified value for the given key or its default value if the key is not present |
| remove | boolean remove(Object key, Object value) | Removes specified keys and values |
| replace | V replace(K key, V value) | Replaces the given key with the specified value |
| replace | boolean replace(K key, V oldValue, V newValue) | Replaces the old value with a new value for a given key |
| replaceAll | void replaceAll(BiFunction < ? super K,? super V,? extends V > function) | Invokes given function to replace all the map entries |
| putIfAbsent | V putIfAbsent(K key, V value) | Inserts the given key, value only if it is not already present |
| compute | V compute(K key, BiFunction < ? super K,? super V,? extends V > remappingFunction) | Computes mapping for specified key and value given the mapping function. |
| computeIfAbsent | V computeIfAbsent(K key, Function < ? super K,? extends V > mappingFunction) | Compute the value for the given key using the mapping function if not already present. |
| computeIfPresent | V computeIfPresent(K key, BiFunction < ? super K,? super V,? extends V > remappingFunction) | Computes new mapping for the given key with the given remapping function if the key value is already present |
| merge | V merge(K key, V value, BiFunction < ? super V,? super V,? extends V > remappingFunction) | Associates a given key with the value if it is not already associated or is associated with the null value. |
All the above methods are supported by the map interface. Note that the methods that appear shaded are the new methods that were included in Java 8.
Java Map Implementation
The following program implements a map example in Java. Here we use most of the methods discussed above.
The example demonstrates various get operations, put, and set operations.
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Main {
public static void main(String[] args) {
//create a map
Map<String, String> country_map = new HashMap<>();
//assign values to the map
country_map.put("IND", "India");
country_map.put("SL", "Srilanka");
country_map.put("CHN", "China");
country_map.put("KOR", "Korea");
country_map.put(null, "Z"); // null key
country_map.put("XX", null); // null value
String value = country_map.get("CHN"); // get
System.out.println("Key = CHN, Value : " + value);
value = country_map.getOrDefault("XX", "Default Value"); //getOrDefault
System.out.println("\nKey = XX, Value : " + value);
boolean keyExists = country_map.containsKey(null); //containsKey
boolean valueExists = country_map.containsValue("Z"); //containsValue
System.out.println("\nnull keyExists : " + keyExists + ", null valueExists= " + valueExists);
Set<Entry<String, String>> entrySet = country_map.entrySet(); //entrySet
System.out.println("\nentry set for the country_map: " + entrySet);
System.out.println("\nSize of country_map : " + country_map.size()); //size
Map<String, String> data_map = new HashMap<>();
data_map.putAll(country_map); //putAll
System.out.println("\ndata_map mapped to country_map : " + data_map);
String nullKeyValue = data_map.remove(null); //remove
System.out.println("\nnull key value for data_map : " + nullKeyValue);
System.out.println("\ndata_map after removing null key = " + data_map);
Set<String> keySet = country_map.keySet(); //keySet
System.out.println("\ndata map keys : " + keySet);
Collection<String> values = country_map.values(); //values
System.out.println("\ndata map values : " + values);
country_map.clear(); //clear
System.out.println("\ndata map after clear operation, is empty :" + country_map.isEmpty());
}
}
Output:
Key = CHN, Value : China
Key = XX, Value : null
null keyExists : true, null valueExists= true
entry set for the country_map: [null=Z, XX=null, CHN=China, SL=Srilanka, IND=India, KOR=Korea]
Size of country_map : 6
data_map mapped to country_map : {null=Z, XX=null, CHN=China, SL=Srilanka, IND=India, KOR=Kore
a}
null key value for data_map : Z
data_map after removing null key = {XX=null, CHN=China, SL=Srilanka, IND=India, KOR=Korea}
data map keys : [null, XX, CHN, SL, IND, KOR]
data map values : [Z, null, China, Srilanka, India, Korea]
data map after clear operation, is empty :true
Sorting A Map In Java
As a map consists of key-value pairs, we can sort the map on keys or values.
In this section, we will sort a map on both keys and values.
Sort By Key
To sort a map on keys, we can use a treemap. The treemap sorts the keys automatically. The below Java program converts a map into a treemap and displays the sorted keys.
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
//declare and initialize a map
Map<String, String> country_map = new HashMap<String, String>();
country_map.put("I", "India");
country_map.put("C", "China");
country_map.put("A", "America");
country_map.put("D", "Denmark");
country_map.put("X", "Hongkong");
//print original map
System.out.println("Original Unsorted Map: ");
display_map(country_map);
System.out.println("\nMap sorted by Key: ");
//convert map to treemap and display it in which keys are auto sorted
Map<String, String> treecountry = new TreeMap<String, String>(country_map);
display_map(treecountry);
}
public static <K, V> void display_map(Map<K, V> map) {
//obtain entry iterator and display key value pairs of map
for (Map.Entry<K, V> entry : map.entrySet()) {
System.out.println("\t" + entry.getKey() + "\t\t" + entry.getValue());
}
}
}
Output:
Original Unsorted Map:
A America
C China
D Denmark
X Hongkong
I India
Map sorted by Key:
A America
C China
D Denmark
I India
X Hongkong
The above program creates a map of <String, String> consisting of a single alphabet code as keys and country names as values. First, we display the original map which is not sorted. Then we convert the map into a treemap that automatically sorts the keys. Finally, we display the sorted treemap on keys.
Sort By Value
To sort a map based on values, we first convert the map into a list. Then we sort this list using Collections.sort () method that uses a comparator to compare the values and arrange them in a specific order.
Once the list is sorted, the linked list entries are again copied to map which gives us the sorted map.
The following Java program demonstrates the sorting of a map based on value. The program uses LinkedHashMap which is passed on to sorting function. In the sorting function, it is converted to a linked list and sorted. After sorting it is converted back to LinkedHashMap.
import java.util.*;
public class Main {
public static void main(String[] args) {
//define and initialize a map
LinkedHashMap<String, String> capitals_map = new LinkedHashMap<>();
capitals_map.put("NEP", "Kathmandu");
capitals_map.put("IND", "New Delhi");
capitals_map.put("USA", "Washington");
capitals_map.put("UK", "London");
capitals_map.put("AUS", "Canberra");
//print original map
System.out.println("Original unsorted map: ");
System.out.println(capitals_map);
//call sortMap method
Map<String, String> sorted_Map = sortMap(capitals_map);
//print the sorted map
System.out.println("\nMap sorted on value : ");
System.out.println("\tKey\tValue ");
for (Map.Entry<String, String> entry : sorted_Map.entrySet())
{
System.out.println("\t" + entry.getKey()+ "\t" + entry.getValue());
}
}
public static LinkedHashMap<String, String> sortMap(LinkedHashMap<String, String> linked_map) {
//create a linkedlist from LinkedHashMap
List<Map.Entry<String, String>> capital_List =
new LinkedList<>(linked_map.entrySet());
//sort the LinkedList
Collections.sort(capital_List, (o1, o2) ->
o1.getValue().compareTo(o2.getValue()));
//Create LinkedHashMap from linkedlist and return it
LinkedHashMap<String, String> finalMap = new LinkedHashMap<>();
for (Map.Entry<String, String> entry : capital_List)
{
finalMap.put(entry.getKey(), entry.getValue());
}
return finalMap;
}
}
Output:
Original unsorted map:
{NEP=Kathmandu, IND=New Delhi, USA=Washington, UK=London, AUS=Canberra
Map sorted on value :
Key Value
AUS Canberra
NEP Kathmandu
UK London
IND New Delhi
USA Washington
Concurrent Map In Java
A concurrentMap is an interface that inherits from java.util.map interface. The concurrentMap interface was first introduced in JDK 1.5 and provides a map that handles concurrent access.
The concurrentMap interface is part of java.util.concurrent package.
The following Java program demonstrates the concurrentMap in Java.
import java.util.concurrent.*;
class Main {
public static void main(String[] args) {
//create and initialize concurrentHashMap
ConcurrentHashMap m = new ConcurrentHashMap();
m.put(100, "Red");
m.put(101, "Green");
m.put(102, "Blue");
System.out.println("\nInitial Concurrent Map : " + m);
//add a key using putIfAbsent method; key=103 is absent so its added
m.putIfAbsent(103, "Purple");
System.out.println("\nAfter adding absent key 103 : " + m);
m.remove(101, "Green"); // remove key = 101
System.out.println("\nConcurrent Map after removing 101:" + m);
m.putIfAbsent(101, "Brown"); // again add key = 101 since its absent
System.out.println("\nAdd absent key 101:" + m);
m.replace(101, "Brown", "Green"); // replace value for key = 101 with 'Green'
System.out.println("\nReplace value at key 101:" + m);
}
}
import java.util.concurrent.*;
class Main {
public static void main(String[] args) {
//create and initialize concurrentHashMap
ConcurrentHashMap m = new ConcurrentHashMap();
m.put(100, "Red");
m.put(101, "Green");
m.put(102, "Blue");
System.out.println("\nInitial Concurrent Map : " + m);
//add a key using putIfAbsent method; key=103 is absent so its added
m.putIfAbsent(103, "Purple");
System.out.println("\nAfter adding absent key 103 : " + m);
m.remove(101, "Green"); // remove key = 101
System.out.println("\nConcurrent Map after removing 101:" + m);
m.putIfAbsent(101, "Brown"); // again add key = 101 since its absent
System.out.println("\nAdd absent key 101:" + m);
m.replace(101, "Brown", "Green"); // replace value for key = 101 with 'Green'
System.out.println("\nReplace value at key 101:" + m);
}
}
Output:
Initial Concurrent Map : {100=Red, 101=Green, 102=Blue}
After adding absent key 103 : {100=Red, 101=Green, 102=Blue, 103=Purple}
Concurrent Map after removing 101:{100=Red, 102=Blue, 103=Purple}
Add absent key 101:{100=Red, 101=Brown, 102=Blue, 103=Purple}
Replace value at key 101:{100=Red, 101=Green, 102=Blue, 103=Purple}
Synchronized Map In Java
A synchronized map is a map that is thread-safe and is backed by a given map. In Java, the Synchronized map is obtained by using the synchronizedMap () method of java.util.Collections class. This method returns a synchronized map for a given map.
This returned synchronized map is used to access the backing map to achieve serial access.
The general declaration of synchronizedMap () method is:
public static <K, V> Map<K,V> synchronizedMap(Map<K,V> m)
where m => is the backed map.
As already mentioned this method returns the synchronized view of map m.
The below Java program is an example of a synchronized map.
import java.util.*;
public class Main {
public static void main(String[] args) {
//declare and initialize a map
Map<Integer, Integer> int_map = new HashMap<>();
int_map.put(1, 10);
int_map.put(2, 20);
int_map.put(3, 30);
int_map.put(4, 40);
int_map.put(5, 50);
//print the map
System.out.println("Original (backed) Map: " + int_map);
//obtain synchronized map
Map<Integer, Integer> sync_map = Collections.synchronizedMap(int_map);
//remove an element from the map
int_map.remove(3, 30);
//print the altered map
System.out.println("\nSynchronized map after remove(3, 30):" + sync_map);
}
}
Output:
Original (backed) Map: {1=10, 2=20, 3=30, 4=40, 5=50}
Synchronized map after remove(3, 30):{1=10, 2=20, 4=40, 5=50}
Static Map In Java
A static map in Java is a map that is declared static just like a static variable. By declaring a map static, it becomes an accessible class variable without using the object.
There are two approaches to creating and initializing a static map in Java.
#1) Using A Static Variable
Here, we create a static map variable and instantiate it along with the declaration.
This approach is demonstrated in the following Java program.
import java.util.*;
class Main {
//declare a static map variable and initialize it with declaration
private static final Map<Integer, String> myMap =
new HashMap<Integer, String>(){
{
put(1, "India");
put(2, "Portugal");
put(3, "Germany");
}
};
public static void main(String[] args) {
//print the map
System.out.println("Static map using static map variable:");
System.out.println(myMap);
}
}
Output:
Static map using static map variable:
{1=India, 2=Portugal, 3=Germany}
#2) Using Static Block
In this, we create a static map variable. Then we create a static block and inside this static block, we initialize the map variable.
The program below demonstrates this.
import java.util.*;
class Main {
// Declare the static map
private static Map<Integer, String> map;
// declare a static block and initialize static map
static {
map = new HashMap<>();
map.put(1, "Red");
map.put(2, "Green");
map.put(3, "Blue");
}
public static void main(String[] args) {
System.out.println("Static Map using static block:");
System.out.println(map);
}
}
Output:
Static Map using static block:
{1=Red, 2=Green, 3=Blue}
Conversion Of The List To Map
In this section, we will discuss the methods to convert the list to a map.
The two methods include:
Traditional Method
In the traditional method, each list element is copied to map using a for-each loop.
This implementation is shown below:
import java.util.*;
public class Main {
public static void main(String[] args) {
//declare and initialize a list
List<String> colorsList = new ArrayList<String>();
colorsList.add("Red");
colorsList.add("Green");
colorsList.add("Blue");
colorsList.add("Brown");
colorsList.add("White");
System.out.println("The given list: " + colorsList);
//declare a map
Map<Integer, String> map = new HashMap<>();
//initial Id(key)
int i=1;
//assign each list element to the map
for (String color : colorsList) {
map.put(i, color);
i++;
}
//print the map
System.out.println("Map generated from List:" + map);
}
}
Output:
The given list: [Red, Green, Blue, Brown, White]
Map generated from List:{1=Red, 2=Green, 3=Blue, 4=Brown, 5=White}
List To Map In Java 8
We can also use Java 8 method Collectors.mapOf () that will convert the given list into a map.
The below program demonstrates this.
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.stream.Collectors;
// class for list
class Subject {
//sub_id => map key
private Integer sub_id;
// sub_name => map value
private String sub_name;
// Subject constructor
public Subject(Integer sub_id, String sub_name) {
// initialize sub_id and sub_name
this.sub_id = sub_id;
this.sub_name = sub_name;
}
// return sub_id
public Integer getSub_Id() {
return sub_id;
}
// return sub_name
public String getSub_Name() {
return sub_name;
}
}
public class Main {
public static void main(String[] args) {
// create a list and add values to the list
List<Subject> sub_list = new ArrayList<>();
sub_list.add(new Subject(1, "Abacus"));
sub_list.add(new Subject(2, "Maths"));
sub_list.add(new Subject(3, "Physics"));
sub_list.add(new Subject(3, "Chemistry"));
//use Java 8 Collectors.toMap() method to create a map and assign list elements to it
LinkedHashMap<Integer, String>
sub_map = sub_list.stream()
.collect( Collectors.toMap(Subject::getSub_Id,
Subject::getSub_Name,(x, y) -> x + ", " + y, LinkedHashMap::new));
//print the map
System.out.println("Map obtained from list : " + sub_map);
}
}
Output:
Map obtained from list : {1=Abacus, 2=Maths, 3=Physics, Chemistry}
In this program, we have a class Subject that acts as a list class. The class Subject has two fields i.e. sub_id and sub_name. We have methods to read the field values from the class. In the main function, we create objects of this class and construct a list.
This list is then converted to the map by using the Collectors.MapOf method that takes the elements one by one. It also takes the sub_Id as the key to the map. Finally, the map that has sub_Id as key and Sub_Name as value is generated.
Convert Map To String In Java
A map collection can be converted to a string using two approaches:
Using StringBuilder
Here we create a StringBuilder object and then copy the key-value pairs of the map into the StringBuilder object. Then we convert the StringBuilder object into a string.
The below program shows the Java code to convert the map to the string.
import java.util.*;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args) {
//create and initialize a map
Map<Integer, String> numberNames = new HashMap<>();
numberNames.put(10, "Ten");
numberNames.put(20, "Twenty");
numberNames.put(30, "Thirty");
numberNames.put(40, "Forty");
//print the given map
System.out.println("The given map: " + numberNames);
//create a StringBuilder object to store string
StringBuilder map_String = new StringBuilder("{");
//append key-value pair of map to StringBuilder object
for (Integer key : numberNames.keySet()) {
map_String.append(key + "=" + numberNames.get(key) + ", ");
}
map_String.delete(map_String.length()-2, map_String.length()).append("}");
//print the string from StringBuilder
System.out.println("\nThe string representation of map:");
System.out.println(map_String.toString());
}
}
Output:
The given map: {20=Twenty, 40=Forty, 10=Ten, 30=Thirty}
The string representation of map:
{20=Twenty, 40=Forty, 10=Ten, 30=Thirty}
Using Java 8 Streams
In this method, we create a stream out of the map keys and then convert it to the string.
The program given below shows the conversion of the map to a string using streams.
import java.util.*;
import java.util.stream.Collectors;
public class Main{
public static void main(String[] args) {
//create and initialize a map
Map<Integer, String> numberNames = new HashMap<>();
numberNames.put(10, "Ten");
numberNames.put(20, "Twenty");
numberNames.put(30, "Thirty");
numberNames.put(40, "Forty");
//print the given map
System.out.println("The given map: " + numberNames);
String map_String = numberNames.keySet().stream()
.map(key -> key + "=" + numberNames.get(key))
.collect(Collectors.joining(", ", "{", "}"));
//print the string
System.out.println("\nThe string representation of map:");
System.out.println(map_String);
}
}
Output:
The given map: {20=Twenty, 40=Forty, 10=Ten, 30=Thirty}
The string representation of map:
{20=Twenty, 40=Forty, 10=Ten, 30=Thirty}
Convert Map To List In Java
A map consists of keys and values whereas a list is a sequence of individual elements. When converting the map to a list, we usually convert keys into a list of keys and values into a list of values.
The following Java program shows this conversion.
import java.util.*;
public class Main {
public static void main(String[] args) {
//declare a map and initialize it
Map<Integer, String> color_map = new HashMap<>();
color_map.put(10, "red");
color_map.put(20, "green");
color_map.put(30, "blue");
color_map.put(40, "cyan");
color_map.put(50, "magenta");
//print the list of keys using map.keySet() method
System.out.println("List of keys from the given map:");
List<Integer> key_list = new ArrayList(color_map.keySet());
System.out.println(key_list);
//print the list of values using map.values() method
System.out.println("\nList of values from the given map:");
List<String> val_list = new ArrayList(color_map.values());
System.out.println(val_list);
}
}
Output:
List of keys from the given map:
[50, 20, 40, 10, 30]
List of values from the given map:
[magenta, green, cyan, red, blue]
Dictionary Vs. Map In Java
Let’s discuss some of the major differences between a dictionary and a map in Java.
| Dictionary | Map |
|---|---|
| Dictionary is an abstract class. | The map is an interface. |
| Classes and methods used by the dictionary class predate collections framework. | Classes and methods used by map classes are part of the collection framework. |
| If a class extends the dictionary, it cannot extend any other class since Java supports only single inheritance | The map is an interface, so a class can inherit from the map and other interfaces |
| Old implementation. Almost obsolete in newer versions of Java. | The map interface has replaced dictionary implementation. |
Frequently Asked Questions
Q #1) Why do we use a map interface in Java?
Answer: The map is an interface in Java that is implemented by classes storing data as key-value pairs. Map interface provides operations/methods that can be performed on key-value pairs like insertion, updating, deletion, etc.
Q #2) What does MAP mean in Java?
Answer: A map in Java represents a mapping of a key with a specific value. A Java map stores these key-value pairs in a map. We can look up and retrieve the value associated with a key just by using the key in the map.
A map is implemented in Java using an interface that is not part of the Collection interface. But the map is a collection.
Q #3) What is MAP get?
Answer: The get () is a method provided by a map interface in Java that is used to retrieve the value associated with a particular key provided as an argument to the get () method. If the value is not present, a null is returned.
Q #4) Is the map a collection?
Answer: Although the map is viewed as a collection in general, it doesn’t implement a Collection interface. Some of the implementations of map, like treemap does not support null values or keys.
Q #5) What is the difference between set and map?
Answer: Set is a collection of keys only whereas the map is a collection of key-value pairs. While the set does not allow null values, some of the map implementations allow null values.
Set does not allow duplicate keys. The map may allow duplicate values but keys must be unique. Set is usually used when we want to store a collection of unique elements. The map can be used when we need to store data in the form of key-value pairs.
Conclusion
In this tutorial, we have discussed the basics of the map interface. We have also seen the various methods and all other details related to the map interface in Java. We came to know that there are various implementations of map interfaces including treemap, hashmap, etc.
In our upcoming tutorials, we will discuss this map implementation in more detail.
=> Visit Here To Learn Java From Scratch.


















