Java四種引用對比

老婆保佑蓄拣,代碼無BUG

前言

面試題:Java中的軟引用,弱引用在Android 是哪個的使用


目錄

  • 一:哪四種引用
  • 二:區(qū)別在哪
  • 三:在Android中的使用場景
      1. Handler 弱引用蟋恬,防止內(nèi)存泄漏
      1. Bitmap軟引用防止OOM
  • 參考

一:哪四種引用

  • 強引用(Strong Reference)
  • 軟引用(Soft Reference)
  • 弱引用(WeakReference)
  • 虛引用

二:區(qū)別在哪

1. 強引用(Strong Reference)

強引用是指在程序代碼中普遍存在的涤久,類似“Object obj=new Object()”這類的引用涡尘,只要強引用還存在,垃圾收集器永遠不會回收掉被引用的對象响迂。

只要某個對象有強引用與之關聯(lián)考抄,JVM必定不會回收這個對象,即使在內(nèi)存不足的情況下蔗彤,JVM寧愿拋出OutOfMemory錯誤也不會回收這種對象

2. 軟引用(Soft Reference)

軟引用是用來描述一些有用但并不是必需的對象川梅。對于軟引用關聯(lián)著的對象疯兼,只有在內(nèi)存不足的時候JVM才會回收該對象。因此挑势,這一點可以很好地用來解決OOM的問題镇防,并且這個特性很適合用來實現(xiàn)緩存:比如網(wǎng)頁緩存啦鸣、圖片緩存等潮饱。JDK 1.2之后,提供了SoftReference類來實現(xiàn)軟引用诫给。

import java.lang.ref.SoftReference;
 
public class Main {
    public static void main(String[] args) {
         
        SoftReference<String> sr = new SoftReference<String>(new String("hello"));
        System.out.println(sr.get());
    }
}

3.弱引用(WeakReference)

弱引用也是用來描述非必需對象的香拉,當JVM進行垃圾回收時,無論內(nèi)存是否充足中狂,都會回收被弱引用關聯(lián)的對象

import java.lang.ref.WeakReference;
 
public class Main {
    public static void main(String[] args) {
     
        WeakReference<String> sr = new WeakReference<String>(new String("hello"));
         
        System.out.println(sr.get());
        System.gc();                //通知JVM的gc進行垃圾回收
        System.out.println(sr.get());
    }
}

輸出結(jié)果

hello
null

4.虛引用(PhantomReference)

虛引用和前面的軟引用凫碌、弱引用不同,它并不影響對象的生命周期胃榕。在java中用java.lang.ref.PhantomReference類表示盛险。如果一個對象與虛引用關聯(lián),則跟沒有引用與之關聯(lián)一樣勋又,在任何時候都可能被垃圾回收器回收苦掘。

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
 
 
public class Main {
    public static void main(String[] args) {
        ReferenceQueue<String> queue = new ReferenceQueue<String>();
        PhantomReference<String> pr = new PhantomReference<String>(new String("hello"), queue);
        System.out.println(pr.get());
    }
}

總結(jié)

對比 強引用 軟引用 弱引用 虛引用
引用強度 最強 第二 第三 最弱
如何使用 new Object() SoftReference WeakReference PhantomReference

三:在Android中的使用場景

1. Handler 弱引用,防止內(nèi)存泄漏

 
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import java.lang.ref.WeakReference;
 
public class MainActivity extends AppCompatActivity {
 
    private Handler handler  ;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        handler = new MyHandler( this ) ;
 
        new Thread(new Runnable() {
            @Override
            public void run() {
               handler.sendEmptyMessage( 0 ) ;
            }
        }).start() ;
 
    }
 
    private static class MyHandler extends Handler {
        WeakReference<MainActivity> weakReference ;
 
        public MyHandler(MainActivity activity ){
            weakReference  = new WeakReference<MainActivity>( activity) ;
        }
 
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if ( weakReference.get() != null ){
                // update android ui
            }
        }
    }
 
}

2. Bitmap軟引用防止OOM

下面這段代碼是摘自博客:

http://blog.csdn.net/arui319/article/details/8489451

private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();
<br>....
public void addBitmapToCache(String path) {
// 強引用的Bitmap對象
Bitmap bitmap = BitmapFactory.decodeFile(path);
// 軟引用的Bitmap對象
SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap);
// 添加該對象到Map中使其緩存
imageCache.put(path, softBitmap);
}
public Bitmap getBitmapByPath(String path) {
// 從緩存中取軟引用的Bitmap對象
SoftReference<Bitmap> softBitmap = imageCache.get(path);
// 判斷是否存在軟引用
if (softBitmap == null) {
return null;
}
// 取出Bitmap對象楔壤,如果由于內(nèi)存不足Bitmap被回收鹤啡,將取得空
Bitmap bitmap = softBitmap.get();
return bitmap;
}

參考

http://blog.csdn.net/sunxianghuang/article/details/52267282

https://www.cnblogs.com/dolphin0520/p/3784171.html

https://www.cnblogs.com/zhaoyanjun/p/5977190.html

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹲嚣,隨后出現(xiàn)的幾起案子递瑰,更是在濱河造成了極大的恐慌,老刑警劉巖隙畜,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抖部,死亡現(xiàn)場離奇詭異,居然都是意外死亡议惰,警方通過查閱死者的電腦和手機您朽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來换淆,“玉大人哗总,你說我怎么就攤上這事”妒裕” “怎么了讯屈?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長县习。 經(jīng)常有香客問我涮母,道長谆趾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任叛本,我火速辦了婚禮沪蓬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘来候。我一直安慰自己跷叉,他們只是感情好,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布营搅。 她就那樣靜靜地躺著云挟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪转质。 梳的紋絲不亂的頭發(fā)上园欣,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音休蟹,去河邊找鬼沸枯。 笑死,一個胖子當著我的面吹牛赂弓,可吹牛的內(nèi)容都是我干的绑榴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拣展,長吁一口氣:“原來是場噩夢啊……” “哼彭沼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起备埃,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤姓惑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后按脚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體于毙,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年辅搬,在試婚紗的時候發(fā)現(xiàn)自己被綠了唯沮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡堪遂,死狀恐怖介蛉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情溶褪,我是刑警寧澤币旧,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站猿妈,受9級特大地震影響吹菱,放射性物質(zhì)發(fā)生泄漏巍虫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一鳍刷、第九天 我趴在偏房一處隱蔽的房頂上張望占遥。 院中可真熱鬧,春花似錦输瓜、人聲如沸瓦胎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凛捏。三九已至担忧,卻和暖如春芹缔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瓶盛。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工最欠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惩猫。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓芝硬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親轧房。 傳聞我的和親對象是個殘疾皇子拌阴,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容