使用List添加WeakReference作为缓存优化

使用List添加WeakReference作为缓存优化

优化点在于当WeakReference里面的get() 对象为空的时候,需要及时删除。

  • 方式1,创建WeakReference的时候,添加ReferenceQueue,当对象被释放的时候,会添加到ReferenceQueue中,可以在调用获取缓存或者是添加缓存的时候,通过ReferenceQueue里面的对象来删除已经被释放的WeakReference。

    new WeakReference<T>(new ReferenceQueue<T>())
    
  • 方式2 ,可以在调用获取缓存或者是添加缓存的时候,使用删除算法来删除,算法是对删除的优化

    public static <T> int unstableRemoveIf(@Nullable ArrayList<T> collection,
                                               @NonNull java.util.function.Predicate<T> predicate) {//predicate为删除条件
            if (collection == null) {
                return 0;
            }
    
            final int size = collection.size();
            int leftIdx = 0;
            int rightIdx = size - 1;
            while (leftIdx <= rightIdx) {
                // Find the next element to remove moving left to right.
                //查询是否有失效的引用,从开始往后面找
                while (leftIdx < size && !predicate.test(collection.get(leftIdx))) {
                    leftIdx++;
                }
    
                // Find the next element to keep moving right to left.
                while (rightIdx > leftIdx && predicate.test(collection.get(rightIdx))) {
                    rightIdx--;
                }
    
                if (leftIdx >= rightIdx) {
                    // Done.
                    break;
                }
                //使用交换,将失效的应用放在后面。
                Collections.swap(collection, leftIdx, rightIdx);
                leftIdx++;
                rightIdx--;
            }
    
            // leftIdx is now at the end.
            //将后面的失效的引用删除
            for (int i = size - 1; i >= leftIdx; i--) {
                collection.remove(i);
            }
            return size - leftIdx;
        }
    

注意: 方法1更加的适合Map这样的数据结构,方法2更加适用于List,尤其是数量比较大的时候,因为这样可以减少大量的对象移动操作,缺点是不支持有序。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容