Java|Java SoftReference类案例详解
软引用简介
软引用是用来表示某个引用会被GC(垃圾处理器)收集的类。
当有引用指向某个obj的时候,通常发生GC的时候不会把这个对象处理掉,但是被软引用包装的对象,当应用内存将要被耗尽的时候-->即将发生OOM,垃圾处理器就会把它带走。这么看来,软应用的生命周期还是很长的,可以用来做缓存处理。
我们可以通过以下方式来创建一个软引用:
SoftReference ref = new SoftReference("Hello world");
接收数据:
String value = https://www.it610.com/article/ref.get(); if (value == null) {// 如果被GC回收了 在这里重新初始化}// 你的逻辑...
软引用用作缓存
创建一个SoftReferenceCache,内部留个HashMap来保存内容。
public class SoftReferenceCache{private final HashMap > mCache; public SoftReferenceCache() {mCache = new HashMap >(); }}
再创建个往里面塞数据的方法。我们在put方法中创建了一个软引用,value类型就是你在生成
SoftReferenceCache
时候创建的。public void put(K key, V value) {mCache.put(key, new SoftReference(value)); }
当然,还需要个get方法。
public V get(K key) {V value = https://www.it610.com/article/null; SoftReferencereference = mCache.get(key); if (reference != null) {value = https://www.it610.com/article/reference.get(); }return value; }
这个方法会判断所要get的内容的状态,在使用get方法的时候,还需要判断返回是否为空,一方面可能本身就没缓存这个对象,另一方面可能他被回收了。
示例
SoftReferenceCachemPersonCache = new SoftReferenceCache (); mPersonCache.put(0, new Person("Peter"); mPersonCache.put(1, new Person("Jan"); mPersonCahce.put(2, new Person("Kees"); // 去拿JanPerson p = (Person) mPersonCache.get(1);
完整代码
import java.lang.ref.SoftReference; import java.util.HashMap; /** * SoftRefenceCache * @paramkey的类型. * @param value的类型. */public class SoftReferenceCache {private final HashMap > mCache; public SoftReferenceCache() {mCache = new HashMap >(); }/*** 将对象放进缓存中,这个对象可以在GC发生时被回收* * @param key key的值.* @param value value的值型.*/public void put(K key, V value) {mCache.put(key, new SoftReference (value)); }/*** 从缓存中获取value* * @param key** @return 如果找到的话返回value,如果被回收或者压根儿没有就返* 回null*/public V get(K key) {V value = https://www.it610.com/article/null; SoftReference reference = mCache.get(key); if (reference != null) {value = https://www.it610.com/article/reference.get(); }return value; }}
看国外大神blog有感并做修改。
【Java|Java SoftReference类案例详解】到此这篇关于Java SoftReference类案例详解的文章就介绍到这了,更多相关Java SoftReference类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 为什么你的路演总会超时()
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- thinkphp|thinkphp 3.2 如何调用第三方类库
- 使用composer自动加载类文件
- 一个健康的APP和健全的人格大体类似
- 数组常用方法一