【Java】【 Android】中的引用分类和使用

Java/android中的引用分类及其使用解析

强应用(Strong reference)
  • 一般形式为A a = new A();这种类型,这是最常见的一种引用方法;
  • 强引用本身存储在栈内存当中,其存储指向内存中对象的地址;
  • 只有当a = null这种情况下,即没有任何强引用再指向这个对象,垃圾回收期才会考虑将这个对象收回。
软引用(Soft Reference)

以下一段实例来讲解软引用

    import java.lang.ref.SoftReference;

    public class ReferenceTest {

    public static void main(String[] args) {

    A a = new A();

    SoftReference<A> srA = new SoftReference<A>(a);

    a = null;

    if (srA.get() == null) {
        System.out.println("a对象进入垃圾回收流程");
    } else {
        System.out.println("a对象尚未被回收" + srA.get());
    }

    // 垃圾回收
    System.gc();

    if (srA.get() == null) {
        System.out.println("a对象进入垃圾回收流程");
    } else {
        System.out.println("a对象尚未被回收" + srA.get());
    }

     }
    }

    class A {

    }

以上运行结果:

    1 a对象尚未被回收A@4807ccf6
    2 a对象尚未被回收A@4807ccf6

以下为对上述软引用的分析

在第一次将A = null;的时候,垃圾回收器可能还没有反应过来,所以没有将这个对象回收掉。但是强行进行垃圾回收的时候,第二次输出结果显示还是没有完成对A的垃圾回收。所以有如下结论:

  • 软引用是以强引用为参数创建的,软引用本身也是存储在栈中,通过新创建的来指向这个软引用对象
  • 何时回收
    • 当其指示没有任何的强引用对象指向其;
    • 并且当虚拟机内存不足的时候才会被垃圾回收器收回。

*因此可知:软引用延长了对象在内存中占据堆内存的时间,所以一般常用的都是软引用。

弱引用(weakReference)

实力代码和软引用类似,只是把所有软引用的地方改成弱引用。但是执行的结果如下

a对象尚未被回收A@52e5376a
a对象进入垃圾回收流程

有以上执行结果可知:

  • 弱引用在对象一旦被置为空的时候,就会被垃圾回收器回收掉;
  • 那弱引用还有何用呢?
    • 当对象已经被引用了,因为业务需要,还需要再次引用这个对象,此时又不想对原来的对象造成任何的影响,此时就可以使用弱引用了,用完了立马被回收掉就好了。相当于一次性筷子使得,用完就丢掉了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值