前几天,一直在想,Reference和普通的引用有什么区别?如下:
纠结了几天,才恍然大悟。关键就在于“bmp被回收了”这句话。
如果,按照第一个方法,bmp是不会被回收的, 因此,java垃圾回收机制是不会回收一个普通引用所指向的对象的;而第二个方法中,由于bmp是通过Reference获取的,这就相当于告诉垃圾回收器:“如果你需要内存,就把握回收了吧”;
因此,在内存充足的情况下,两个方法的效果是一样的;但是,在内存不足的情况下,第一个方法会报OutOfMemory的错误,而第二个方法,由于Reference所指向的bmp已经被回收了,则是走了return的分支,不会发生奔溃。
举个简单的例子:将内存比作鞋架,对象比作鞋,假设架子上可以放置10双鞋。现在,架子上放满了10双鞋,那么,新来的鞋没有地方放,就只能说:没有地方放鞋了;但是,如果鞋架上有一双鞋打了个标签,说:“如果没有地方放鞋,就把我扔了。”那么,我们就可以把旧的鞋扔了,新到的鞋就有地方放了。而鞋上的标签,就代表着Reference。
由此可知,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,如快速缓存等。