import java.util.HashMap; import java.util.Map; public class Cache { private Map cacheMap; public Cache() { cacheMap = new HashMap<>(); } public void put(K key, V value) { cacheMap.put(key, new CacheEntry(value)); } public void put(K key, V value, long expireTimeMs) { cacheMap.put(key, new CacheEntry(value, expireTimeMs)); } public V get(K key) { CacheEntry entry = cacheMap.get(key); if (entry == null) { return null; } if (entry.isExpired()) { cacheMap.remove(key); return null; } entry.updateAccessTime(); return entry.getValue(); } public boolean containsKey(K key) { CacheEntry entry = cacheMap.get(key); if (entry == null) { return false; } if (entry.isExpired()) { cacheMap.remove(key); return false; } return true; } public V remove(K key) { CacheEntry entry = cacheMap.remove(key); return entry != null ? entry.getValue() : null; } public int size() { return cacheMap.size(); } public void clear() { cacheMap.clear(); } private class CacheEntry { private V value; private long createTime; private long accessTime; private long expireTimeMs; public CacheEntry(V value) { this(value, -1); } public CacheEntry(V value, long expireTimeMs) { this.value = value; this.expireTimeMs = expireTimeMs; this.createTime = System.currentTimeMillis(); this.accessTime = this.createTime; } public V getValue() { return value; } public void updateAccessTime() { this.accessTime = System.currentTimeMillis(); } public boolean isExpired() { if (expireTimeMs <= 0) { return false; } return System.currentTimeMillis() > createTime + expireTimeMs; } public long getCreateTime() { return createTime; } public long getAccessTime() { return accessTime; } } }