java中弱引用知识学习WeakHashMap、WeakReference

先占个坑,今天因为项目需求所以想到了java中的弱引用特性。

首先什么是弱引用?

Object a = new Object();

Object b = a;

比如上面的代码,b就是a的强引用。当我们对a变量进行修改时,b对应的也会发生变化。并且当GC想要回收a变量所占用的内存时,会因为b持有了a的强引用,导致对a的内存回收失败,进而导致内存泄漏。

所谓弱引用,就是用来解决这个问题的。

Object tmp = new Object();
WeakReference<Object> weakReference = new WeakReference<>(tmp);
weakReference.get();//如果此方法为空,说明tmp已经被GC回收

上方的代码就是典型的弱引用使用示例。当我们使用weakReference.get()(弱引用)访问对象时,可以获得与强引用一样的效果,但当tmp对象需要被GC回收时,不会因为weakReference持有tmp的引用而导致回收失败。

weakReference.get()返回的是tmp的弱引用,我们可以对它的操作和使用一般的强引用是一模一样的。唯一的区别就是当tmp被gc回收后,weakReference.get()会返回null。

也正因为如此,弱引用常常用于缓存处理。

PS:另外再记录一下,我写弱引用demo的时候,学到了java中String类型的特殊性

int param = 10;
String str1 = "abc";
String str2 = new String("abc");

str1与str2是内容一样的String类型变量。但str1的声明方式导致了str1的值是存储在常量池中的,就如同变量param一样,它并不是一个对象。而str2则是通过new关键字声明的,在java中,str2才是一个真正“对象”。只有这类“对象”才能被弱引用,常量池中的变量是不存在弱引用的概念的

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值