Trong bài này, chúng ta sẽ tìm hiểu về class Java LinkedHashMap và các thao tác của nó qua các ví dụ.

Class LinkedHashMap collections framework trong Java triển khai hash table và linked list của Map interface.

Giao diện LinkedHashMap mở rộng HashMap class để lưu trữ các mục của nó trong một hash table. Nó duy trì một danh sách liên kết đôi trong nội bộ trong số tất cả các mục để ra lệnh cho các mục của nó.

1. Tạo một LinkedHashMap

Để tạo một LinkedHashMap, trước hết ta cần import gói java.util.LinkedHashMap. Khi import xong, chúng ta có thể tạo các LinkedHashMap trong Java theo cách sau:

// LinkedHashMap with initial capacity 8 and load factor 0.6
LinkedHashMap<Key, Value> numbers = new LinkedHashMap<>(8, 0.6f);

Trong đoạn code trên, chúng ta đã tạo ra một LinkedHashMap có tên là numbers.

Ở đây,

Key- một mã định danh duy nhất được sử dụng để liên kết từng phần tử(giá trị) trong map

Value- các phần tử được liên kết bởi các key trong map

Chú ý phần new LinkedHashMap<>(8, 0.6). Ở đây, tham số đầu tiên là capacity và tham số thứ hai là loadFactor .

capacity  – Dung lượng của linked hashmap này là 8. Ý nghĩa: nó có thể lưu trữ 8 mục.

loadFactor – Hệ số tải của LinkedHashMap này là 0,6. Điều này có nghĩa là, bất cứ khi nào HashMap của chúng ta được lấp đầy 60%, các mục nhập vào sau đó sẽ được chuyển sang hash table mới có kích thước gấp đôi hash table ban đầu.

2. Dung lượng và hệ số tải mặc định 

Có thể tạo một LinkedHashMap mà không cần xác định hệ số tải và dung lượng của nó. Ví dụ,

//LinkedHashMap with default capacity and load factor
LinkedHashMap<Key, Value> numbers1 = new LinkedHashMap<>();

Theo mặc định,

dung lượng của LinkedHashMap sẽ là 16

Hệ số tải sẽ là 0,75

Lưu ý : Class LinkedHashMap cũng cho phép chúng ta xác định thứ tự của các mục. Ví dụ

// LinkedHashMap with specified order
LinkedHashMap<Key, Value> numbers2 = new LinkedHashMap<>(capacity, loadFactor, accessOrder);

Ở đây, accessOrder là một giá trị kiểu boolean. Giá trị mặc định của nó là false. Trong trường hợp này, các mục trong LinkedHashMap được sắp xếp trên theo thứ tự chèn vào của chúng.

Tuy nhiên, nếu accessorder mang giá trị true, các mục trong LinkedHashMap sẽ được sắp xếp theo thứ tự truy cập ít nhất đến truy cập nhiều nhất.

3. Tạo LinkedHashMap từ các Map khác

Sau đây là cách chúng ta có thể tạo một LinkedHashMap có chứa tất cả các phần tử của các map khác.

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.LinkedHashMap;

class Main {
    public static void main(String[] args) {
        // Creating a LinkedHashMap of even numbers
        LinkedHashMap<String, Integer> evenNumbers = new LinkedHashMap<>();
        evenNumbers.put("Two", 2);
        evenNumbers.put("Four", 4);
        System.out.println("LinkedHashMap1: " + evenNumbers);

        // Creating a LinkedHashMap from other LinkedHashMap
        LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>(evenNumbers);
        numbers.put("Three", 3);
        System.out.println("LinkedHashMap2: " + numbers);
    }
}

Kết quả

LinkedHashMap1: {Two=2, Four=4}
LinkedHashMap2: {Two=2, Four=4, Three=3}

4. Các hàm của LinkedHashMap

Class LinkedHashMap cung cấp hàm cho phép chúng ta thực hiện các toán tử khác nhau trên map.

5. Chèn các phần tử vào LinkedHashMap

  • put() – chèn key/ value được chỉ định vào map
  • putAll() – chèn tất cả các mục từ map được chỉ định vào map này
  • putIfAbsent() – chèn key/ value được chỉ định vào map nếu key được chỉ định không có trong map

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.LinkedHashMap;

class Main {
    public static void main(String[] args) {
        // Creating LinkedHashMap of even numbers
        LinkedHashMap<String, Integer> evenNumbers = new LinkedHashMap<>();

        // Using put()
        evenNumbers.put("Two", 2);
        evenNumbers.put("Four", 4);
        System.out.println("Original LinkedHashMap: " + evenNumbers);

        // Using putIfAbsent()
        evenNumbers.putIfAbsent("Six", 6);
        System.out.println("Updated LinkedHashMap(): " + evenNumbers);

        //Creating LinkedHashMap of numbers
        LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>();
        numbers.put("One", 1);

        // Using putAll()
        numbers.putAll(evenNumbers);
        System.out.println("New LinkedHashMap: " + numbers);
    }
}

Kết quả

Original LinkedHashMap: {Two=2, Four=4}
Updated LinkedHashMap: {Two=2, Four=4, Six=6}
New LinkedHashMap: {One=1, Two=2, Four=4, Six=6}

6. Truy cập các phần tử LinkedHashMap

6.1 Sử dụng hàm entryset (), keyset () và value ()

  • entrySet() – trả về một tập hợp tất cả key/ value của map
  • keySet() – trả về một tập hợp tất cả các key của map
  • values() – trả về một tập hợp tất cả các value của map

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.LinkedHashMap;

class Main {
    public static void main(String[] args) {
        LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>();

        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("LinkedHashMap: " + 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());
    }
}

Kết quả

LinkedHashMap: {One=1, Two=2, Three=3}
Key/Value mappings: [One=1, Two=2, Three=3]
Keys: [One, Two, Three]
Values: [1, 2, 3]

6.2 Sử dụng hàm get() và getOrDefault()

  • get()- Trả về value liên kết với key được chỉ định. Nếu không tìm thấy key, nó sẽ trả về null.
  • getOrDefault()- Trả về value liên quan đến key được chỉ định. Nếu không tìm thấy key, nó sẽ trả về value mặc định đã chỉ định.

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.LinkedHashMap;

class Main {
    public static void main(String[] args) {

        LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("LinkedHashMap: " + numbers);

        // Using get()
        int value1 = numbers.get("Three");
        System.out.println("Returned Number: " + value1);

        // Using getOrDefault()
        int value2 = numbers.getOrDefault("Five", 5);
        System.out.println("Returned Number: " + value2);
    }
}

Kết quả

LinkedHashMap: {One=1, Two=2, Three=3}
Returned Number: 3
Returned Number: 5

6.3 Xóa các phần tử khỏi LinkedHashMap

  • remove(key) – trả về và xóa mục liên quan đến key chỉ định từ map
  • remove(key, value) – chỉ xóa mục khỏi map nếu key được chỉ định liên kết với value được chỉ định và trả về giá trị boolean

Ví dụ,

/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/

import java.util.LinkedHashMap;

class Main {
    public static void main(String[] args) {

        LinkedHashMap<String, Integer> numbers = new LinkedHashMap<>();
        numbers.put("One", 1);
        numbers.put("Two", 2);
        numbers.put("Three", 3);
        System.out.println("LinkedHashMap: " + numbers);

        // remove method with single parameter
        int value = numbers.remove("Two");
        System.out.println("Removed value: " + value);

        // remove method with two parameters
        boolean result = numbers.remove("Three", 3);
        System.out.println("Is the entry Three removed? " + result);

        System.out.println("Updated LinkedHashMap: " + numbers);
    }
}

Kết quả

LinkedHashMap: {One=1, Two=2, Three=3}
Removed value: 2
Is the entry {Three=3} removed? True
Updated LinkedHashMap: {One=1}

7. Các hàm khác của LinkedHashMap

hàmSự miêu tả
clear()xóa tất cả các mục khỏi map
containsKey()kiểm tra xem map có chứa key được chỉ định hay không và trả về giá trị boolean
containsValue()kiểm tra xem map có chứa value được chỉ định hay không và trả về giá trị boolean
size()trả về kích thước của map
isEmpty()kiểm tra xem map có trống không và trả về giá trị boolean

8. LinkedHashMap Vs. HashMap

Cả LinkedHashMap và HashMap đều triển khai giao diện Map. Tuy nhiên, có một số khác biệt giữa chúng.

  • LinkedHashMap duy trì một danh sách liên kết đôi trong nội bộ. Do đó, nó bảo toàn thứ tự được chèn vào của các phần tử của nó.
  • Class LinkedHashMap tốn nhiều vùng lưu trữ hơn HashMap. Đó là do LinkedHashMap duy trì LinkedList trong nội bộ.
  • Hiệu suất của LinkedHashMap chậm hơn HashMap.

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!