一、LinkedHashMap的概述
LinkedHashMap是Java中util包下的一個類。它是HashMap的一個子類。HashMap是一種無序的鍵值對存儲結構,而LinkedHashMap則是一種有序的鍵值對存儲結構。LinkedHashMap是將Java的Map接口和鏈表數據結構相結合的一個實現。在LinkedHashMap中,每個元素都有指向前驅和後繼元素的引用。同時,LinkedHashMap繼承了HashMap的所有優點,包括高效的查找和插入操作,同時支持訪問順序和插入順序的迭代。
// LinkedHashMap的定義
public class LinkedHashMap
extends HashMap
implements Map
{
}
二、LinkedHashMap的特點
1.有序性
LinkedHashMap是有序的。它有兩種順序,一種是插入順序,一種是訪問順序。通過構造方法中的accessOrder參數控制其順序。默認情況下,accessOrder參數為false,表示按照插入順序排序;如果為true,則按訪問順序排序。
// 查找元素時,可設置訪問順序,如下所示
LinkedHashMap map = new LinkedHashMap(16,0.75f,true);
map.put(3,10);
map.put(1,20);
map.put(2,30);
map.put(4,40);
2.非線程安全
LinkedHashMap不是線程安全的。如果需要實現線程安全的Map,可以使用ConcurrentHashMap。
3.重寫了removeEldestEntry方法
LinkedHashMap重寫了removeEldestEntry方法。默認情況下,這個方法總是返回false。但是,如果重寫該方法,在滿足一定條件的情況下,可以移除最老的元素,以保證Map不會無限擴容。
// 重寫removeEldestEntry方法,滿足了map元素大於閾值時則移除最老的元素
LinkedHashMap map = new LinkedHashMap() {
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > 3;
}
};
map.put(1, 1);
map.put(2, 2);
map.put(3, 3);
三、LinkedHashMap的使用場景
1.需要有序性的存儲場景
LinkedHashMap以插入順序或訪問順序排序,可以方便地從頭到尾遍歷Map中的元素,同時也可以手動控制元素的順序。
2.需要在LRU緩存中使用Map
LRU緩存的原理就是“最近最少使用”算法。我們可以使用LinkedHashMap的accessOrder參數來實現LRU。當有元素被訪問時,它會被從“末尾”(最不常使用)移動到“開頭”(最近訪問)。我們可以通過在構造方法中將accessOrder參數設為true來實現。
下面給出一個簡單的LRU緩存的實現:
public class LRUCache extends LinkedHashMap {
private int cacheSize;
public LRUCache(int cacheSize) {
super(16, 0.75f, true);
this.cacheSize = cacheSize;
}
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > cacheSize;
}
}
3.需要近似於線程安全的Map
雖然不是線程安全的,但LinkedHashMap仍可以被用於處理一些近似於線程安全的場景。 對於多線程環境中,可以使用ConcurrentHashMap。如果能夠保證某些操作的順序,可以使用LinkedHashMap代替線程安全的Map。
原創文章,作者:XXCV,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/149538.html