Mục lục
Nếu như các bạn từng biết đến HashMap thì nó là một cấu trúc dạng key – value cho phép truy xuất các phần tử nhanh chóng dựa theo key. Thế nhưng HashMap lại không đảm bảo thứ tự của các phần tử nên Java cung cấp thêm LinkedHashMap ngoài các tính năng như HashMap thì nó còn đảm bảo thứ tự của các phần tử được thêm vào.
Các đặc tính quan trọng của LinkedHashMap
- LinkedHashMap implement từ Map interface và extends từ HashMap.
- LinkedHashMap có thể chứa một key null và nhiều value null.
- LinkedHashMap gần giống với HashMap ngoại trừ việc LinkedHashMap đảm bảo thứ tự khi thêm các phần tử vào.
Chúng ta có thể khai báo một LinkedHashMap như sau:
LinkedHashMap<Integer, String> lhm = new LinkedHashMap<Integer, String>();
Constructor LinkedHashMap
LinkedHashMap có 5 constructor:
- LinkedHashMap(): Constructor mặc định.
- LinkedHashMap(int capacity): Khởi tạo với sức chứa capacity cụ thể.
- LinkedHashMap(Map m_a_p):Khởi tạo với các phần tử trong HashMap cho trước.
- LinkedHashMap(int capacity, float loadFactor): Khởi tạo với sức chứa capacity và loadFactor cụ thể.
- LinkedHashMap(int capacity, float loadFactor, boolean Order): Khởi tạo với sức chứa capacity và loadFactor cụ thể với chỉ định kiểu sắp xếp.
import java.util.LinkedHashMap; class BasicLinkedHashMap { public static void main(String a[]) { LinkedHashMap<String, String> lhm = new LinkedHashMap<>(); lhm.put("1", "share"); lhm.put("2", "programming"); lhm.put("3", "net"); System.out.println(lhm); System.out.println("Getting value for key 'one': " + lhm.get("1")); System.out.println("Size of the map: " + lhm.size()); System.out.println("Is map empty? " + lhm.isEmpty()); System.out.println("Contains key '2'? " + lhm.containsKey("2")); System.out.println("Contains value 'programming" + lhm.containsValue("programming")); lhm.remove("1"); System.out.println(lhm); } }
Output:
{1=share, 2=programming, 3=net}
Getting value for key ‘one’: share
Size of the map: 3
Is map empty? false
Contains key ‘2’? true
Contains value ‘programmingtrue
{2=programming, 3=net}
Khi nào nên sử dụng LinkedHashMap
Như đã nêu ở trên thì LinkedHashMap hầu như giống với HashMap chỉ khác là các phần tử được thêm vào sẽ có thứ tự. Mình còn nhớ trước đây làm một task về UI, bạn mình có dùng HashMap để group các nhóm lại theo và show chúng lên màn hình. Thế nhưng bị cái là lúc này nó lên khác, lúc kia nó lên khác vì các phần tử không có thứ tự. Cuối cùng phải sử dụng LinkedHashMap kết hợp với việc sắp xếp trước khi thêm vào LinkedHashMap để có một thứ tự theo một chuẩn sắp xếp nào đấy.
Hiệu năng của HashMap so với LinkedHashMap
Cũng giống như HashMap, LinkedHashMap thực hiện các Map operator cơ bản như thêm, xóa và tìm kiếm trong một constant-time, miễn là hàm băm có kích thước tốt. Nó cũng chấp nhận một khóa null cũng như các giá trị null.
Tuy nhiên, constant-time của LinkedHashMap có thể kém hơn một chút so với constant-time của HashMap do chi phí duy trì danh sách liên kết kép.
Việc duyệt phần tử LinkedHashMap cũng mất thời gian tuyến tính O (n) tương tự như của HashMap. Mặt khác, hiệu suất thời gian tuyến tính của LinkedHashMap trong quá trình lặp lại tốt hơn thời gian tuyến tính của HashMap. Điều này là do, đối với LinkedHashMap, n trong O (n) là chỉ số các phần tử trong map liên quan đến capacity. Trong khi đó, đối với HashMap, n là dung lượng và tổng kích thước,O(size+capacity).
Hệ số tải và Dung lượng ban đầu được xác định chính xác như đối với HashMap. Tuy nhiên, lưu ý rằng hậu quả đối với việc chọn giá trị quá cao cho dung lượng ban đầu đối với LinkedHashMap ít nghiêm trọng hơn đối với HashMap, vì thời gian lặp lại cho lớp này không bị ảnh hưởng bởi dung lượng.
Concurrency
Cũng giống như HashMap, việc triển khai LinkedHashMap không được đồng bộ hóa. Vì vậy, nếu bạn định truy cập nó từ nhiều luồng và ít nhất một trong những luồng này có khả năng thay đổi cấu trúc của nó, thì nó phải được đồng bộ hóa bên ngoài.
Tốt nhất là làm điều này khi tạo
Map m = Collections.synchronizedMap(new LinkedHashMap());
Các method trong LinkedHashMap
- void clear(): Xoá tất cả các phần tử trong LinkedHashMap.
- boolean containsKey(Object key): Trả về true nếu key được chỉ định chứa trong LinkedHashMap, ngược lại false.=
- Object get(Object key): Trả về value tương ứng với key được chỉ định.
- entrySet?(): Sẽ về entry set của LinkedHashMap.
- forEach?(BiConsumer<K,V> action): Sử dụng để duyệt LinkedHashMap.
- getOrDefault?(Object key, V defaultValue): Trả về giá trị của key được chỉ định. Nếu key không chứa trong LinkedHashMap thì method này sẽ trả về defaultValue.
- keySet?(): Trả về một tập key của LinkedHashMap.
- removeEldestEntry?(Map.Entry<K,V> eldest):
- replaceAll?(BiFunction<K,V> function): Cập nhật tất các phần tử trong LinkedHashMap.
- values?(): Trả về collection các giá trị trong LinkedHashMap.
Nguồn tham khảo
https://www.geeksforgeeks.org/linkedhashmap-class-java-examples/
https://www.baeldung.com/java-linked-hashmap