使用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,尤其是数量比较大的时候,因为这样可以减少大量的对象移动操作,缺点是不支持有序。