Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

LinkedHashMap และ LinkedHashSet ใน Java: คงลำดับการเพิ่ม

LinkedHashMap

Hash table + Linked list = คงลำดับการ insert (insertion-order) อนุญาต null key/value ได้ 1 คีย์

ตัวอย่าง

import java.util.*;

public class Demo {
    public static void main(String[] args) {
        LinkedHashMap map = new LinkedHashMap<>();
        map.put(67, "Joe");
        map.put(90, "Dev");
        map.put(null, "Nate");   // null key ได้ 1 ตัว
        map.put(68, "Sara");
        map.put(69, "Amal");
        map.put(null, "Jake");   // แทนที่ค่า null key เดิม
        map.put(69, "Ral");      // แทนที่ key 69 เดิม
        
        map.forEach((k, v) -> System.out.println(k + " -> " + v));
    }
}

ผลลัพธ์

67 -> Joe
90 -> Dev
null -> Jake
68 -> Sara
69 -> Ral

LinkedHashSet

Hash table + Linked list = คงลำดับการ add ไม่อนุญาต duplicate (Set)

ตัวอย่าง

import java.util.*;

public class Demo {
    public static void main(String[] args) {
        LinkedHashSet set = new LinkedHashSet<>();
        set.add("Joe");
        set.add("Dev");
        set.add("Nate");
        set.add("Sara");
        set.add("Amal");
        set.add("Jake");
        set.add("Ral");
        
        for (String s : set) {
            System.out.println(s);
        }
    }
}

ผลลัพธ์

Joe
Dev
Nate
Sara
Amal
Jake
Ral

ความแตกต่างสำคัญ

คุณสมบัติLinkedHashMapLinkedHashSet
InterfaceMap<K,V>Set<E>
Key/Valueคู่ key-valueแค่ element
Null keyได้ 1 ตัวได้ 1 ตัว (เป็น element)
Duplicate keyแทนที่ค่าเก่าไม่อนุญาต (ignore)
OrderInsertion-orderInsertion-order
Access-orderได้ (constructor param)ไม่ได้

Access-Order LinkedHashMap (สำหรับ LRU Cache)

// accessOrder = true: ลำดับตามการเข้าถึง (get/put) ล่าสุดอยู่ท้าย
LinkedHashMap lruMap = new LinkedHashMap<>(16, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry eldest) {
        return size() > 100; // จำกัดขนาด max 100
    }
};