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ó.
Nội dung chính
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àm | Sự 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.