JAVA软引用与弱引用及其应用举例

1. 定义强引用、软引用和弱引用的方式

  1. new出来的是强引用,比如String str = new String(“123” );
  2. 弱引用:
WeakReference<String> weakRef=new WeakReference<String>(str);

其中str是引用
另外弱引用对应了一种map: WeakHashMap,它与HashMap相比前者的键是弱引用,而后者的键是强引用。下面的代码可以证明:

public class WeakHashMapDemo {  
    public static void main(String[] args) throws Exception {  
        String a = new String("a");  
        String b = new String("b");  
        Map weakmap = new WeakHashMap();  
        Map map = new HashMap();  
        map.put(a, "aaa");  //a上有String和HashMap的强引用
        map.put(b, "bbb");  //b上有String和HashMap的强引用
        weakmap.put(a, "aaa"); //再给a加上弱引用
        weakmap.put(b, "bbb"); //再给b加上弱引用
        map.remove(a);  //撤销a上HashMap的强引用
        a=null;  //撤销a上String的强引用,a上只有弱引用
        b=null;  //撤销b上String的强引用,b上有HashMap的强引用和弱引用
        System.gc();  //垃圾回收
        Iterator i = map.entrySet().iterator();  
        while (i.hasNext()) {  
            Map.Entry en = (Map.Entry)i.next();  
            System.out.println("map:"+en.getKey()+":"+en.getValue());//map:b:bbb
        }

        Iterator j = weakmap.entrySet().iterator();  
        while (j.hasNext()) {  //a上没有强引用,只有弱引用,会自动回收
            Map.Entry en = (Map.Entry)j.next();  
            System.out.println("weakmap:"+en.getKey()+":"+en.getValue());//weakmap:b:bbb
        }  
    }  
}

  1. 软引用:
 SoftReference<String> softRef=new SoftReference<String>(str);

2. 软引用和弱引用的回收时机

  1. 对象上有强引用,不会被回收
  2. 如果一个对象只有软引用, 且当前虚拟机堆内存空间足够,不会回
    收,反之会回收
  3. JVM一旦发现某块内存上只有弱引用,不管当前内存空
    间是否足够,都会回收
public class ReferenceDemo {
	public static void main(String[] args) {
		// 强引用
		String str=new String("abc");                                     
		// 软引用
		SoftReference<String> softRef=new SoftReference<String>(str);     
		str = null;  // 去掉强引用
		System.gc(); // 垃圾回收器进行回收
		System.out.println(softRef.get());//abc
		
		// 强引用
		String abc = new String("123");
		// 弱引用
		WeakReference<String> weakRef=new WeakReference<String>(abc);     
		abc = null;  // 去掉强引用
		System.gc(); // 垃圾回收器进行回收
		System.out.println(weakRef.get());//null
	}
}

3. 以具体案例讲述软引用的用法

  1. 博客管理系统里,用缓存的方式存储点击过的博文
  2. 定义类型为HashMap<String, SoftReference<Content>>的对
    象类缓存博文,其中键是文章ID,值是指向Content的软引用
  3. 如JVM内存空间够,可以通过缓存提升性能,如果内存不够,会
    释放软引用的缓存,最多影响性能,不影响功能
    在这里插入图片描述
    总结:利用软引用根据内存空间的情况来回收的特性来缓存数据。

4. 以具体案例讲述弱引用的用法

  1. 电商项目里,需要保存优惠券Conpon和所有用户的对应关系
  2. 数据结构:
 WeakHashMap<Coupon, <List<WeakReference<User>>>

,键是优惠券,值是指向用户列表的弱引用
3. 假设优惠券coupon3对应100个用户,那么每个user对象上有包含
用户信息的userList上强引用和上述结构里的弱引用,不会回收(即将用户信息存放在两个列表上,一个强引用,一个弱引用)
在这里插入图片描述

  1. 当用户user1注销后, userList 里会删除该对象
  2. 它只有优惠券-用户关系表上的弱引用,会被自动回收
  3. 优惠券-用户关系会自动更新,无需干预
    在这里插入图片描述
    总结:利用弱引用会被回收和强引用不会被回收的特性来实现自动更新对象的功能。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值