LinkedHashMap使用心得


基本概念:https://www.cnblogs.com/xiaoxi/p/6170590.html

遇到問題:

 

1、構造方法

public static LinkedHashMap<String,Long> lhm= new LinkedHashMap<String,Long>(16, 0.75f, true);  //一定要加true,不然不會按照訪問順序排序。

 

2、訪問方式

使用get(Object o)方式會改變該KEY值訪問順序,必須使用如下方法訪問:

LinkedHashMap<String,Long> lhm = new LinkedHashMap<String,Long>(16, 0.75f, true);
Set<Map.Entry<String, Long>> set = lhm.entrySet();
Iterator<Map.Entry<String, Long>> iterator = set.iterator();
synchronized (iterator) {
while (iterator.hasNext())
{
Entry<String, Long> entry = iterator.next();
long vintime = entry.getValue();
System.out.print(vintime+" ");
}
}

3、該數據結構非線程安全,多線程使用必須加鎖

1) get()

2) put()

3) 遍歷

 

import java.util.LinkedHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LRULinkedHashMap<K, V> extends LinkedHashMap<K, V> {
/**
*
*/
private static final long serialVersionUID = -952299094512767664L;
private final int maxCapacity;
private static final float DEFAULT_LOAD_FACTOR = 0.75f;
private final Lock lock = new ReentrantLock();

public LRULinkedHashMap(int maxCapacity) {
super(maxCapacity, DEFAULT_LOAD_FACTOR, true);
this.maxCapacity = maxCapacity;
}

@Override
protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
return size() > maxCapacity;
}

@Override
public V get(Object key) {
try {
lock.lock();
return super.get(key);
} finally {
lock.unlock();
}
}
//可以根據實際情況,考慮對不同的操作加鎖
@Override
public V put(K key, V value) {
try {
lock.lock();
return super.put(key, value);
} finally {
lock.unlock();
}
}

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM