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

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

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

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

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

    public static  int unstableRemoveIf(@Nullable ArrayList collection,
                                               @NonNull java.util.function.Predicate 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,尤其是数量比较大的时候,因为这样可以减少大量的对象移动操作,缺点是不支持有序。

你可能感兴趣的:(使用List添加WeakReference作为缓存优化)