利用软引用实现简单的缓存

前言:
前面已经可以看到软引用的缓存方式,不过还不够具体这里专门写一个类来实现缓存:


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方法哦)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值