1. Map trong Java là gì?

Map trong Java là một Interface sử dụng cấu trúc lưu trữ các đối tượng (phần tử) theo dạng keyvalue. Nghĩa là một phần tử trong Map sẽ là một cặp giá trị có khóa là key và giá trị tương ứng với khóa đó sẽ là value. Trong Map Interface, các giá trị khóa key sẽ phải là các phần tử duy nhất và không được trùng lặp.

Khi làm việc với Map trong Java, chúng ta sẽ có hai Interface thường được sử dụng để triển khai một Map đó là: Map()SortedMap() hoặc chúng ta cũng có thể sử dụng ba lớp có trong Java để triển khai một Map đó là các lớp: HashMap(), LinkedHashMap(), và TreeMap().

Map trong Java rất hữu ích nếu bạn cần phải thực hiện các công việc như tìm kiếm, cập nhật hoặc xóa các phần tử dựa theo một khóa key. Như đã đề cập ở trên, Map trong Java sẽ không cho chúng ta lưu trữ các khóa key là các giá trị trùng lặp tuy nhiên, Map lại cho phép lưu trữ các value có thể là trùng lặp.

Khi triển khai Map bằng các lớp HashMap()LinkedHashMap() chúng ta còn có thể lưu trữ các giá trị rỗng cho cả KeyValue, nhưng khi triển khai Map bằng lớp TreeMap() chúng sẽ không cho phép lưu trữ bất kỳ Key hoặc Value rỗng nào. Map Interface có trong thư viện java.util và để sử dụng được Map trong Java ta chỉ cần nhập thư viện: import java.util.*;

2. Khai báo Map trong Java

Khai báo một Map trong Java ta chỉ cần tạo ra một Interface Map với phần triển khai có thể là các lớp HashMap(), LinkedHashMap(), và TreeMap() (vấn đề này đã được đề cập ở trên). Một Map mới trong Java sau khi khởi tạo thành công sẽ là một Map rỗng và các phần tử sẽ lưu trữ theo dạng một cặp {key:value}. Dưới đây là các cách khai báo Map trong Java:

//Khai bao map va trien khai theo lop HashMap()
Map map = new HashMap();  
//Khai bao map2 va trien khai theo lop LinkedHashMap()
Map map2 = new LinkedHashMap();
//Khai bao map3 va trien khai theo lop TreeMap()
Map map3 = new TreeMap();

Trong các ví dụ dưới đây, chúng ta sẽ cùng nhau sử dụng kiểu khai báo  Map map = new HashMap(); để thực hiện các ví dụ thao tác với Map trong Java. Trong ví dụ minh họa dưới đây về kiểu Map trong Java, chúng ta sẽ cùng nhau sử dụng kiểu khai báo trên để thực hiện triển khai một Map trong Java. Sau đó kiểm tra Map vừa khởi tạo có rỗng không? Và hiển thị ra các phần tử có trong Map đó như sau:

import java.util.*;  
public class Main {
    public static void main(String[] args) {
    	//Khoi tao mot Map moi
    	Map map = new HashMap();
        //Kiem tra Map vua tao co rong hay khong?
        boolean result = map.isEmpty();
        System.out.println("Map vua khoi tao co rong hay khong? \n" + result);
        //Kiem tra phan tu trong Map
        System.out.println("Phan tu co trong Map la: \n" + map);  
    }
}

Kết quả:

Map vua khoi tao co rong hay khong? 
true
Phan tu co trong Map la: 
{}

Thông qua ví dụ trên, ta thấy rằng một Map sẽ rỗng khi vừa được khởi tạo và các phần tử của Map sẽ được lưu trữ bên trong dấu ngoặc nhọn {}.

3. Thao tác với Map trong Java

Như đã đề cập ở phần đầu tiên, kiểu Map trong Java rất dễ dàng thực hiện cho các công việc tìm kiếm, cập nhật hoặc xóa các phần tử dựa theo một khóa key. Vì vậy mà trong các ví dụ dưới đây chúng ta sẽ thực hiện chính với Map là các thao tác trên!

3.1 Thêm phần tử vào Map trong Java

Mỗi phần tử bên trong Map sẽ là các cặp giá trị được lưu trữ theo dạng cặp (key:value), nên việc thêm phần tử vào trong Map chính là việc ta cập nhập vào Map đó các cặp giá trị (key:value) mới. Để thực hiện được việc thêm phần tử vào trong Map ta chỉ cần gọi đến phương thức có sẵn Map.put() và truyền 2 tham số tương ứng: tham số đầu tiên là Key của phần tử cần thêm, tham số thứ hai là Value của phần tử cần thêm.

Phương thức Map.put() trả về true nếu việc thêm một phần tử vào trong Map thành công, ngược lại phương thức này sẽ trả về false.

import java.util.*;  
public class Main {
    public static void main(String[] args) {
    	//Khoi tao mot Map moi
    	Map map = new HashMap();
        //Kiem tra Map vua tao co rong hay khong?
        boolean result = map.isEmpty();
        System.out.println("Map vua khoi tao co rong hay khong? \n" + result);
        //Kiem tra phan tu trong Map
        System.out.println("Phan tu co trong Map la: \n" + map);  
        
        //Them cac phan tu vao Map
        map.put(1,"NguyenVanA");  
        map.put(2,"NguyenVanB");  
        map.put(3,"NguyenVanC");  
        map.put(4,"NguyenVanD");  
        
        //Kiem tra Map sau khi them phan tu co rong khong?
        boolean result2 = map.isEmpty();
        System.out.println("Map sau khi them phan tu co rong hay khong? \n" + result2); 
        //Kiem tra phan tu trong Map
        System.out.println("Phan tu co trong Map sau khi them la: \n" + map);
    }
}

Kết quả:

Map vua khoi tao co rong hay khong? 
true
Phan tu co trong Map la: 
{}
Map sau khi them phan tu co rong hay khong? 
false
Phan tu co trong Map sau khi them la: 
{1=NguyenVanA, 2=NguyenVanB, 3=NguyenVanC, 4=NguyenVanD}

3.2 Duyệt các phần tử trong Map

Map Interface có một giao diện con đó là Entry. Chúng ta có thể truy cập đến Entry bằng cách gọi đến Map.Entry. Entry sẽ trả về một một Map theo dạng Set và chuyển đổi các phần tử trong Map thành các phần tử thuộc lớp này. Khi đó ta có thể tận dụng để sử dụng các các phương thức để lấy khóa Key và giá trị Value của Map một cách dễ dàng.

import java.util.*;  
public class Main {
    public static void main(String[] args) {
        //Khoi tao mot Map moi
        Map map = new HashMap(); 
        //Them cac phan tu vao Map
        map.put(1,"NguyenVanA");  
        map.put(2,"NguyenVanB");  
        map.put(3,"NguyenVanC");  
        map.put(4,"NguyenVanD");  

        //Kiem tra phan tu trong Map
        System.out.println("Phan tu co trong Map sau khi them la: \n" + map);
        //Duyet cac phan tu trong Map
        System.out.println("Duyet cac phan tu trong Map theo dang Key:Value");
        //Chuyen doi Map ve Set de duyet qua cac phan tu
        Set set = map.entrySet();
        //Tao doi tuong lap iterator
        Iterator itr = set.iterator();  
        while(itr.hasNext()){  
            //Chuyen doi thanh Map.Entry de co the lay key va value 
            Map.Entry entry = (Map.Entry)itr.next();  
            //Hien thi Key:Value cua Map
            System.out.println(entry.getKey()+":"+entry.getValue());  
        }  
    }
}

Kết quả:

Phan tu co trong Map sau khi them la: 
{1=NguyenVanA, 2=NguyenVanB, 3=NguyenVanC, 4=NguyenVanD}
Duyet cac phan tu trong Map theo dang Key:Value
1:NguyenVanA
2:NguyenVanB
3:NguyenVanC
4:NguyenVanD

3.3 Tìm kiếm phần tử trong Map

Việc tìm kiếm một phần tử trong Map được thực hiện khi ta biết giá trị Key của phần tử cần tìm. Sau đó ta cần kiểm tra xem Key của phần tử đang cần tìm có tồn tại trong Map hay không? Nếu như có thì ta sẽ lấy Value dựa theo Key đó.

Phương thức Map.containsKey() sẽ giúp chúng ta kiểm tra xem Key mà ta đang cần tìm kiếm có tồn tại trong Map hay không và phương thức Map.get() sẽ giúp chúng ta lấy ra Value của phần tử cần tìm kiếm dựa vào Key. Cùng theo dõi ví dụ dưới đây để hiểu rõ hơn.

import java.util.*;  
public class Main {
    public static void main(String[] args) {
        //Khoi tao mot Map moi
        Map map = new HashMap(); 
        //Them cac phan tu vao Map
        map.put(1,"NguyenVanA");  
        map.put(2,"NguyenVanB");  
        map.put(3,"NguyenVanC");  
        map.put(4,"NguyenVanD");  

        //Kiem tra phan tu trong Map
        System.out.println("Phan tu co trong Map sau khi them la: \n" + map);
        
        //Vi du tim kiem phan tu co Key=3 trong Map
        //Neu ton tai Key = 3 trong Map
        if (map.containsKey(3)){
            //Hien thi gia tri Value theo Key=3
            System.out.println("Tim thay phan tu");
            System.out.println("Key=3, Value=" + map.get(3));
        }else{ //Nguoc lai, neu khong ton tai Key=3 trong Map
            System.out.println("Không tim thay phan tu Value co Key=3 trong Map");
        }
    }
}

Kết quả:

Phan tu co trong Map sau khi them la: 
{1=NguyenVanA, 2=NguyenVanB, 3=NguyenVanC, 4=NguyenVanD}
Tim thay phan tu
Key=3, Value=NguyenVanC

4. Các phương của Map trong Java

Trong các ví dụ trên, chúng ta đã cũng nhau sử dụng khá nhiều các phương thức hữu ích của Map. Tuy nhiên, để tận dụng Map một cách trọn vẹn nhất chúng ta cần nắm bắt được thêm các phương thức của Map. Bảng dưới đây sẽ liệt kê ra các phương thức thường dùng trong Map.

Phương thức Mô tả
put(Object key, Object value) Chèn một cặp phần tử (Key,Value) vào trong Map.
void putAll(Map map) Chèn các phần tử của Map này vào trong một Map khác.
putIfAbsent(K key, V value) Chèn Value được chỉ định với Key được chỉ định vào trong Map nếu nó chưa có trong Map.
remove(Object key) Xóa đi một cặp phần tử trong Map dựa vào Key
boolean remove(Object key, Object value) Xóa đi một cặp phần tử trong Map dựa theo Key và Value.
Set keySet() Chuyển các Key của Map vào trong một Set.
Set<Map.Entry<K,V>> entrySet() Chuyển đổi các phần tử trong Map sang Set bao gồm giá trị Key,Value của Map ban đầu.
void clear() Xóa đi toàn bộ phần tử trong Map.
boolean equals(Object o) So sánh xem một giá trị được chỉ định với Map xem chúng có bằng nhau không?
boolean containsKey(Object key) Trả về True nếu một Key thuộc trong Map, ngược lại sẽ trả về False.
void forEach(BiConsumer<? super K,? super V> action) Duyệt qua từng phần tử có trong một Map, sau khi tất cả phần tử đã được duyệt xong thì sẽ ném ra một ngoại lệ.
get(Object key) Lấy ra giá trị Value dựa theo Key được chỉ định trong Map.
getOrDefault(Object key, V defaultValue) Lấy ra giá trị Value dựa theo Key. Nếu Key không tồn tại trong Map thì sẽ đặt defaultValue cho Key đó.
int hashCode() Trả về giá trị mã băm cho Map.
boolean isEmpty() Kiểm tra xem Map đó có rỗng hay không?
replace(K key, V value) Thay thế một Value mới dựa theo Key trong Map.
boolean replace(K key, V oldValue, V newValue) Thay thế Value cũ oldValue thành một Value mới newValue dựa vào Key trong Map.
Collection values() Chuyển đổi các Value trong Map vào Collection.
int size() Lấy ra số lượng phần tử trong Map.