Java Reference 使用

前几天,一直在想,Reference和普通的引用有什么区别?如下:
void setBitmap(Bitmap bmp){
	if (bmp == null)
		return;
	else
		doSomeThingAboutBitmap(bmp);		
}
void setBitmap(SoftReference<Bitmap> reference){
	Bitmap bmp = reference.get();
	if (bmp == null)
		return;
	else
		doSomeThingAboutBitmap(bmp);		
}
在两个方法中,除了“Bitmap bmp = reference.get();”这句话,其他的代码是一模一样;而且,从执行的效果上看,也是一样的。如果bmp被回收了,就啥都不处理;如果bmp没有被回收,就进行处理。
纠结了几天,才恍然大悟。关键就在于“bmp被回收了”这句话。
如果,按照第一个方法,bmp是不会被回收的, 因此,java垃圾回收机制是不会回收一个普通引用所指向的对象的;而第二个方法中,由于bmp是通过Reference获取的,这就相当于告诉垃圾回收器:“如果你需要内存,就把握回收了吧”;
因此,在内存充足的情况下,两个方法的效果是一样的;但是,在内存不足的情况下,第一个方法会报OutOfMemory的错误,而第二个方法,由于Reference所指向的bmp已经被回收了,则是走了return的分支,不会发生奔溃。
举个简单的例子:将内存比作鞋架,对象比作鞋,假设架子上可以放置10双鞋。现在,架子上放满了10双鞋,那么,新来的鞋没有地方放,就只能说:没有地方放鞋了;但是,如果鞋架上有一双鞋打了个标签,说:“如果没有地方放鞋,就把我扔了。”那么,我们就可以把旧的鞋扔了,新到的鞋就有地方放了。而鞋上的标签,就代表着Reference。
由此可知,Reference的使用时针对内存的。如果我们希望:继续持有某个对象的引用,同时有希望允许垃圾回收器能够给释放该引用,就需要用到Reference,如快速缓存等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值