Java SoftReference类 Java SoftReference类案例详解
大玩具 人气:0想了解Java SoftReference类案例详解的相关内容吗,大玩具在本文为您仔细讲解Java SoftReference类的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Java,SoftReference类,Java,SoftReference类详解,下面大家一起来学习吧。
软引用简介
软引用是用来表示某个引用会被GC(垃圾处理器)收集的类。
当有引用指向某个obj的时候,通常发生GC的时候不会把这个对象处理掉,但是被软引用包装的对象,当应用内存将要被耗尽的时候-->即将发生OOM,垃圾处理器就会把它带走。这么看来,软应用的生命周期还是很长的,可以用来做缓存处理。
我们可以通过以下方式来创建一个软引用:
SoftReference<String> ref = new SoftReference<String>("Hello world");
接收数据:
String value = ref.get(); if (value == null) { // 如果被GC回收了 在这里重新初始化 } // 你的逻辑 ...
软引用用作缓存
创建一个SoftReferenceCache,内部留个HashMap来保存内容。
public class SoftReferenceCache<K, V> { private final HashMap<K, SoftReference<V>> mCache; public SoftReferenceCache() { mCache = new HashMap<K, SoftReference<V>>(); } }
再创建个往里面塞数据的方法。我们在put方法中创建了一个软引用,value类型就是你在生成SoftReferenceCache
时候创建的。
public void put(K key, V value) { mCache.put(key, new SoftReference<V>(value)); }
当然,还需要个get方法。
public V get(K key) { V value = null; SoftReference<V> reference = mCache.get(key); if (reference != null) { value = reference.get(); } return value; }
这个方法会判断所要get的内容的状态,在使用get方法的时候,还需要判断返回是否为空,一方面可能本身就没缓存这个对象,另一方面可能他被回收了。
示例
SoftReferenceCache<Integer, Person> mPersonCache = new SoftReferenceCache<Integer, Person>(); mPersonCache.put(0, new Person("Peter"); mPersonCache.put(1, new Person("Jan"); mPersonCahce.put(2, new Person("Kees"); // 去拿Jan Person p = (Person) mPersonCache.get(1);
完整代码
import java.lang.ref.SoftReference; import java.util.HashMap; /** * SoftRefenceCache * @param <K> key的类型. * @param <V> value的类型. */ public class SoftReferenceCache<K, V> { private final HashMap<K, SoftReference<V>> mCache; public SoftReferenceCache() { mCache = new HashMap<K, SoftReference<V>>(); } /** * 将对象放进缓存中,这个对象可以在GC发生时被回收 * * @param key key的值. * @param value value的值型. */ public void put(K key, V value) { mCache.put(key, new SoftReference<V>(value)); } /** * 从缓存中获取value * * @param key * * @return 如果找到的话返回value,如果被回收或者压根儿没有就返* 回null */ public V get(K key) { V value = null; SoftReference<V> reference = mCache.get(key); if (reference != null) { value = reference.get(); } return value; } }
看国外大神blog有感并做修改。
加载全部内容