网龙Java面试题解析
一、问题描述
在网龙公司的Java面试中,常常会涉及到关于集合类的问题。下面是一道经典的面试题:
请编写一个Java类,实现一个简单的缓存系统,要求具备以下功能:
- 缓存系统的大小有限,当缓存容量达到上限后,需要按照某种策略(如LRU)来淘汰最近最少使用的缓存项。
- 缓存项设定了一个过期时间,超过过期时间的缓存项需要被自动删除。
二、解决方案
为了实现上述功能,我们可以创建一个Cache
类,并利用Java的集合类进行实现。
首先,我们需要定义一个CacheItem
类,用于存储缓存项的信息,包括键、值、过期时间等。
public class CacheItem<V> {
private String key;
private V value;
private long expireTime;
// 构造函数
public CacheItem(String key, V value, long expireTime) {
this.key = key;
this.value = value;
this.expireTime = expireTime;
}
// getter和setter方法
// ...
}
接下来,我们可以在Cache
类中使用HashMap
来存储缓存项,并定义一些方法来实现缓存的添加、查找、淘汰等功能。
import java.util.HashMap;
import java.util.Map;
public class Cache<V> {
private Map<String, CacheItem<V>> cacheMap;
private int capacity;
// 构造函数
public Cache(int capacity) {
this.capacity = capacity;
this.cacheMap = new HashMap<>();
}
// 添加缓存项
public void put(String key, V value, long expireTime) {
// 检查缓存容量是否已满
if (cacheMap.size() >= capacity) {
// 淘汰最近最少使用的缓存项
evict();
}
// 创建新的缓存项并放入缓存中
CacheItem<V> cacheItem = new CacheItem<>(key, value, expireTime);
cacheMap.put(key, cacheItem);
}
// 查找缓存项
public V get(String key) {
CacheItem<V> cacheItem = cacheMap.get(key);
if (cacheItem != null) {
// 检查缓存项是否过期
if (System.currentTimeMillis() < cacheItem.getExpireTime()) {
return cacheItem.getValue();
} else {
// 缓存项已过期,删除缓存
cacheMap.remove(key);
}
}
return null;
}
// 淘汰缓存项
private void evict() {
// 根据某种策略(如LRU)来淘汰缓存项
// ...
// 这里省略具体的淘汰策略实现
}
}
三、使用示例
现在,我们可以创建一个Cache
对象,并使用其添加和查找功能来演示缓存系统的使用。
public class Main {
public static void main(String[] args) {
// 创建一个容量为3的缓存系统
Cache<String> cache = new Cache<>(3);
// 添加缓存项
cache.put("key1", "value1", System.currentTimeMillis() + 1000); // 过期时间为1秒
cache.put("key2", "value2", System.currentTimeMillis() + 2000); // 过期时间为2秒
cache.put("key3", "value3", System.currentTimeMillis() + 3000); // 过期时间为3秒
// 查找缓存项
String value1 = cache.get("key1");
System.out.println("key1的值为:" + value1);
// 等待缓存项过期
try {
Thread.sleep(1500); // 等待1.5秒
} catch (InterruptedException e) {
e.printStackTrace();
}
// 再次查找缓存项
String value2 = cache.get("key1");
System.out.println("key1的值为:" + value2);
}
}
四、总结
通过上述实现,我们可以看到如何使用Java的集合类来实现一个简单的缓存系统。该缓存系统具备限制容量、过