LinkedHashSet和LinkedHashMap 這兩個類維護一個雙向鏈表,可以記住插入元素的順序。 實例:LinkedHashMap 可以使用訪問順序來迭代處理映射條目,當get或者put訪問元素時,受影響的條目從當前位置刪除,然後放到末尾,隻影響鏈表,不影響散列表的桶。 LinkedHas ...
LinkedHashSet和LinkedHashMap
這兩個類維護一個雙向鏈表,可以記住插入元素的順序。
實例:LinkedHashMap
可以使用訪問順序來迭代處理映射條目,當get或者put訪問元素時,受影響的條目從當前位置刪除,然後放到末尾,隻影響鏈表,不影響散列表的桶。
LinkedHashMap<K,V>(initialCapacity, loadFactor,true) //構造訪問順序迭代處理的Map
這樣的好處是,可以保持”最近最少使用原則“,這樣當容器滿的時候可以通過覆蓋removeEldestEntry來刪掉前面的很少使用的緩存,。
// 定義一個容量為10,裝填因數為0.75,訪問順序的cache,
// 當size/容量>裝填因數時,散列表就會再次散列。
var cache = new LinkedHashMap<String,Integer>(10, 0.75F, true){
// 覆寫該方法,則會刪除掉Map中最不常訪問的元素。
protected boolean removeEldestEntry(Map.Entry<String,Integer> eldest){
// 當容器的內容>5時刪掉最不常訪問的元素
return size() > 5;
}
};
cache.put("zs", 1);
cache.put("ls", 2);
cache.put("ww", 2);
cache.put("zs",3); // 對張s進行覆蓋,則會出現在最後訪問之後
cache.forEach((k,v)->{
System.out.println(k+":"+v);
});
/*
ls:2
ww:2
zs:3
*/
System.out.println("================");
cache.put("ml", 1);
cache.put("zl", 3);
cache.forEach((k,v)->{
System.out.println(k+":"+v);
});
/*此時Map的size已經到5,添加一個元素後,將最不常訪問到的第一個元素刪除
ls:2
ww:2
zs:3
ml:1
zl:3
*/
System.out.println("***************");
cache.put("lll", 4);
cache.forEach((k,v)->{
System.out.println(k+":"+v);
});
/*
ww:2
zs:3
ml:1
zl:3
lll:4
*/