前言:
前面已经可以看到软引用的缓存方式,不过还不够具体这里专门写一个类来实现缓存:
public class Cache {
private HashMap<Object,ObjectRef> SoftCache;//用于cache内容的存储
private ReferenceQueue<Object> queue;//reference的队列
//创建一个私有弱引用的数据类,再利用队列获得这个弱引用利用该弱引用清除缓存立仍然存在的键值对
//这里用了一个information类,里面的name作为一个唯一键(唯一键可以利用Hash值,类似mybatis)
private class ObjectRef extends SoftReference<Object>{
//主要用于在清除HashMap中的键值对
Object key;
public ObjectRef(Object key,Object value,ReferenceQueue<Object> queue) {
super(value,queue);
key = key;
}
}
public Cache(){
SoftCache = new HashMap<>();
queue = new ReferenceQueue<>();
}
/**
*
* 插入缓存数据
* @param information
*/
public void set(Object key , Object value) {
//先清除已经被GC的软引用
cleanCache();
ObjectRef ref = new ObjectRef(key, value, queue);
SoftCache.put(key, ref);
}
/**
* 获取缓存数据
* @param name
* @return
*/
public Object get(Object value) {
ObjectRef ref = SoftCache.get(value);
if (ref == null) {
return null;
}
return ref.get();
}
//清除队列中无用引用的同时清除SoftCache中的无效关系(这里可以用WeakMap)
private void cleanCache() {
ObjectRef ref = null;
while((ref= (ObjectRef) queue.poll())!=null){
SoftCache.remove(ref.key);
}
}
//清空缓存
public void clear() {
cleanCache();
SoftCache.clear();
}
}
就实现来说也并不复杂,但是注意SoftCache的key的建议用string或者是自己将可以作为key的对象(重写hasCode和equal方法哦)