在开发中咱们常常会遇到存储的数据须要设置过时时间的问题,原生的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表达式定时清除过时。配置