要在
HashMap
中的元素上设置失效时间,可以使用一个自定义的数据结构,其中每个元素包含键、值和过期时间。然后,可以在访问元素时检查其过期时间,以确保不使用已过期的数据。
示例:如何在
ExpiringHashMap
中存储带有过期时间的键值对,并在访问时检查过期。
import java.util.HashMap;
public class ExpiringHashMap<K, V> {
private final HashMap<K, ExpiringValue<V>> map = new HashMap<>();
// 添加元素到 HashMap 并指定过期时间(毫秒)
public void put(K key, V value, long expirationMillis) {
long expirationTime = System.currentTimeMillis() + expirationMillis;
ExpiringValue<V> expiringValue = new ExpiringValue<>(value, expirationTime);
map.put(key, expiringValue);
}
// 获取元素,如果元素已经过期,返回 null
public V get(K key) {
ExpiringValue<V> expiringValue = map.get(key);
if (expiringValue != null && !expiringValue.isExpired()) {
return expiringValue.getValue();
} else {
map.remove(key); // 如果元素已过期,从 HashMap 中移除
return null;
}
}
// 内部类,表示带有过期时间的值
private static class ExpiringValue<V> {
private final V value;
private final long expirationTime;
ExpiringValue(V value, long expirationTime) {
this.value = value;
this.expirationTime = expirationTime;
}
V getValue() {
return value;
}
boolean isExpired() {
return System.currentTimeMillis() >= expirationTime;
}
}
public static void main(String[] args) {
ExpiringHashMap<String, String> expiringHashMap = new ExpiringHashMap<>();
expiringHashMap.put("key1", "value1", 5000); // 设置过期时间为5秒
expiringHashMap.put("key2", "value2", 10000); // 设置过期时间为10秒
// 从 HashMap 中获取元素
String value1 = expiringHashMap.get("key1");
String value2 = expiringHashMap.get("key2");
System.out.println("Value1: " + value1); // 应该打印 "Value1: value1"
System.out.println("Value2: " + value2); // 应该打印 "Value2: value2"
// 5秒后再次尝试获取 key1 的值
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String value1AfterExpiration = expiringHashMap.get("key1");
System.out.println("Value1 (after expiration): " + value1AfterExpiration); // 应该打印 "Value1 (after expiration): null"
}
}