1 import java.util.*;2
3 /**
4 * @Title: ExpiryMap 可以设置过期时间的Map5 * @description ExpiryMap继承至HashMap 重写了所有对外的方法,对每个key值都设置了有效期6 * @Author: xx7 * @Version: 1.08 */
9 public class ExpiryMap extends HashMap{10
11 private static final long serialVersionUID = 1L;12
13 /**
14 * default expiry time 2s15 */
16 private long EXPIRY = 1000 * 2;17
18 private HashMap expiryMap = new HashMap<>();19
20 /**缓存实例对象*/
21 private volatile static ExpiryMapSameUrlMap;22
23 /**
24 * 采用单例模式获取实例25 *@return
26 */
27 public staticExpiryMap getInstance() {28 //第一次判空,提高效率
29 if (null ==SameUrlMap) {30 //保证线程安全
31 synchronized (ExpiryMap.class) {32 //第二次判空,保证单例对象的唯一性,防止第一次有多个线程进入第一个if判断
33 if (null ==SameUrlMap) {34 SameUrlMap = new ExpiryMap<>();35 }36 }37 }38 returnSameUrlMap;39 }40
41 publicExpiryMap(){42 super();43 }44
45 public ExpiryMap(longdefaultExpiryTime){46 this(1 << 4, defaultExpiryTime);47 }48
49 public ExpiryMap(int initialCapacity, longdefaultExpiryTime){50 super(initialCapacity);51 this.EXPIRY =defaultExpiryTime;52 }53
54 @Override55 publicV put(K key, V value) {56 expiryMap.put(key, System.currentTimeMillis() +EXPIRY);57 return super.put(key, value);58 }59
60 @Override61 public booleancontainsKey(Object key) {62 return !checkExpiry(key, true) && super.containsKey(key);63 }64 /**
65 *@paramkey66 *@paramvalue67 *@paramexpiryTime 键值对有效期 毫秒68 *@return
69 */
70 public V put(K key, V value, longexpiryTime) {71 expiryMap.put(key, System.currentTimeMillis() +expiryTime);72 return super.put(key, value);73 }74
75 @Override76 public intsize() {77 returnentrySet().size();78 }79
80 @Override81 public booleanisEmpty() {82 return entrySet().size() == 0;83 }84
85 @Override86 public booleancontainsValue(Object value) {87 if (value == null) {88 returnBoolean.FALSE;89 }90 Set> set = super.entrySet();91 Iterator> iterator =set.iterator();92 while(iterator.hasNext()) {93 java.util.Map.Entry entry =iterator.next();94 if(value.equals(entry.getValue())){95 if(checkExpiry(entry.getKey(), false)) {96 iterator.remove();97 returnBoolean.FALSE;98 }else{99 returnBoolean.TRUE;100 }101 }102 }103 returnBoolean.FALSE;104 }105
106 @Override107 public Collectionvalues() {108
109 Collection values = super.values();110
111 if(values == null || values.size() < 1) {112 returnvalues;113 }114
115 Iterator iterator =values.iterator();116
117 while(iterator.hasNext()) {118 V next =iterator.next();119 if(!containsValue(next)) {120 iterator.remove();121 }122 }123 returnvalues;124 }125
126 @Override127 publicV get(Object key) {128 if (key == null) {129 return null;130 }131 if(checkExpiry(key, true)) {132 return null;133 }134 return super.get(key);135 }136 /**
137 *138 * @Description: 是否过期139 *@paramkey140 *@returnnull:不存在或key为null -1:过期 存在且没过期返回value 因为过期的不是实时删除,所以稍微有点作用141 */
142 publicObject isInvalid(Object key) {143 if (key == null) {144 return null;145 }146 if(!expiryMap.containsKey(key)){147 return null;148 }149 long expiryTime =expiryMap.get(key);150
151 boolean flag = System.currentTimeMillis() >expiryTime;152
153 if(flag){154 super.remove(key);155 expiryMap.remove(key);156 return -1;157 }158 return super.get(key);159 }160
161 @Override162 public void putAll(Map extends K, ? extends V>m) {163 for (Map.Entry extends K, ? extends V>e : m.entrySet()) {164 expiryMap.put(e.getKey(), System.currentTimeMillis() +EXPIRY);165 }166 super.putAll(m);167 }168
169 @Override170 public Set>entrySet() {171 Set> set = super.entrySet();172 Iterator> iterator =set.iterator();173 while(iterator.hasNext()) {174 java.util.Map.Entry entry =iterator.next();175 if(checkExpiry(entry.getKey(), false)) {176 iterator.remove();177 }178 }179
180 returnset;181 }182 /**
183 *184 * @Description: 是否过期185 *@paramexpiryTime true 过期186 *@paramisRemoveSuper true super删除187 *@return
188 */
189 private boolean checkExpiry(Object key, booleanisRemoveSuper){190
191 if(!expiryMap.containsKey(key)){192 returnBoolean.FALSE;193 }194 long expiryTime =expiryMap.get(key);195
196 boolean flag = System.currentTimeMillis() >expiryTime;197
198 if(flag){199 if(isRemoveSuper) {200 super.remove(key);201 }202 expiryMap.remove(key);203 }204 returnflag;205 }206
207 public static void main(String[] args) throwsInterruptedException {208 ExpiryMap map = new ExpiryMap<>();209 map.put("test", "xxx");210 map.put("test2", "ankang", 5000);211 System.out.println("test==" + map.get("test"));212 Thread.sleep(3000);213 System.out.println("test==" + map.get("test"));214 System.out.println("test2==" + map.get("test2"));215 Thread.sleep(3000);216 System.out.println("test2==" + map.get("test2"));217 }218 }