在開發中咱們常常會遇到存儲的數據須要設置過時時間的問題,原生的map並不能知足咱們的要求,這時咱們能夠經過改造hashmap來實現咱們想要的功能。直接上代碼:ide
public class TimingMap<K, V> extends HashMap<K, V> {
// 存放過時日期的map
private Map<String, Long> timingMap = new HashMap<String, Long>();
// 過時時間
private final long expireTime = 1800000;.net
/**
* 重寫put方法
*/
@Override
public V put(K key, V value) {
timingMap.put((String) key, System.currentTimeMillis() + expireTime);
return super.put(key, value);
}對象
/**
* 初始化的時候
*/
public TimingMap() {
super();
Timer timer = new Timer();
TimerTask task = new TimerTask() { // 建立一個新的計時器任務。
@Override
public void run() {
List<String> removeList = new ArrayList<String>();
for (String key : timingMap.keySet()) {
long currentTime = System.currentTimeMillis();
if (currentTime > timingMap.get(key)) {
removeList.add(key);
}
}
removeExpireData(removeList);
}
};
timer.schedule(task, 1000, 60000); // 一分鐘刷新一次
}開發
/**
* 移除過時數據
*
* @param keys
*/
public void removeExpireData(List<String> keys) {
for (String key : keys) {
timingMap.remove(key);
super.remove(key);
}
}rem
/**
* 重寫get方法
*/
@Override
public V get(Object key) {
long currentTime = System.currentTimeMillis();
if (currentTime > timingMap.get(key)) {
timingMap.remove(key);
super.remove(key);
return null;
}
return super.get(key);
}get
/**
* 重寫移除方法
*/
@Override
public V remove(Object key) {
timingMap.remove(key);
return super.remove(key);
}hash
/**
* 重寫清除方法
*/
@Override
public void clear() {
timingMap.clear();
super.clear();
}class
/**
* 添加一個定時清除方法,方便後面和task集成用配置cron表達式的方法清除數據
*/
public void scheduledClear() {
List<String> removeList = new ArrayList<String>();
for (String key : timingMap.keySet()) {
long currentTime = System.currentTimeMillis();
if (currentTime > timingMap.get(key)) {
removeList.add(key);
}
}
removeExpireData(removeList);
}
}hashmap
這樣咱們就能夠設置一個靜態TimingMap對象,用來實現定時清除map裏面的數據了。還能夠scheduledClear方法配合使用定時任務用cron表達式定時清除過時。配置