91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中有哪些引用類型

發布時間:2021-04-13 15:15:28 來源:億速云 閱讀:156 作者:Leah 欄目:開發技術

Java中有哪些引用類型?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

強引用

強引用是最常用的引用類型,如下所示,new Object()會創建一個Object對象并存儲在堆上,變量object存儲對該對象的強引用。

Object object = new Object();

強引用不會被垃圾回收,所以要想回收該對象,則應該將指向該對象的變量顯示設為null,這樣該對象就由強引用轉變為無引用了。

示例:

public class ReferenceDemo {
    public static void main(String[] args) throws IOException {
        //強引用不會被垃圾回收
        ReferenceDemo referenceDemo = new ReferenceDemo();
        //強引用轉變為無引用,無引用可被垃圾回收
        referenceDemo = null;
        //觸發垃圾回收
        System.gc();
        //阻塞主線程,等待垃圾回收線程執行
        System.in.read();
    }

    //對象被回收之前調用
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("-----finalize-----");
    }
}

軟引用

軟引用是使用SoftReference創建的,在內存空間充足的情況下,軟引用不會被回收,而在內存空間不足虛擬機拋出OutOfMemoryError之前,軟引用將會被回收。

示例:

public class ReferenceDemo {
    public static void main(String[] args) throws InterruptedException {
        //創建ReferenceDemo對象的軟引用
        SoftReference<ReferenceDemo> softReference = new SoftReference<>(new ReferenceDemo());
        //觸發垃圾回收
        System.gc();
        //阻塞主線程,等待垃圾回收線程執行
        Thread.sleep(5000);
        //softReference.get()返回軟引用對象,如果對象已經被垃圾回收,則返回null
        System.out.println(softReference.get());

        //創建25M的字節數組
        byte[] bytes = new byte[1024 * 1024 * 25];
        //內存已經不足,阻塞主線程,等待垃圾回收線程執行
        Thread.sleep(5000);
        //重新輸出軟引用對象
        System.out.println(softReference.get());
    }
}

/*
 * 輸出結果:
 * com.buhe.demo.demos.reference.ReferenceDemo@76fb509a
 * null
 */

注意:示例運行前需要設置堆內存大小為30M(-Xmx30m -Xms30m)。

用途:軟引用可以用于對內存空間敏感的緩存,緩存的對象一直保存,直到內存空間不足而被回收。

弱引用

弱引用是使用WeakReference創建的,在垃圾回收線程執行過程中,只要找到了弱引用,不管內存空間是否足夠,弱引用對象都將被回收。由于垃圾回收線程是一個優先級很低的線程,因此不一定會很快發現那些只具有弱引用的對象。

示例:

public class ReferenceDemo {
    public static void main(String[] args) throws InterruptedException {
        //創建ReferenceDemo的弱引用
        WeakReference<ReferenceDemo> weakReference = new WeakReference<>(new ReferenceDemo());
        //weakReference.get()返回弱引用對象,如果對象已經被垃圾回收,則返回null
        System.out.println(weakReference.get());

        //觸發垃圾回收
        System.gc();
        //阻塞主線程,等待垃圾回收線程執行
        Thread.sleep(3000);

        //重新輸出弱引用對象
        System.out.println(weakReference.get());
    }
}

/*
 * 輸出結果:
 * com.buhe.demo.demos.reference.ReferenceDemo@76fb509a
 * null
 */

用途:弱引用也可以用于緩存,可以參考WeakHashMap類。

虛引用

虛引用是使用PhantomReference創建的,它是所以引用類型中最弱的。虛引用對象和沒有引用的對象相同,可以在任何時候被垃圾回收,并且虛引用必須要與引用隊列一起使用。

當垃圾回收線程回收一個虛引用對象時,它將在垃圾回收后銷毀該對象,并將PhantomReference添加到引用隊列中。

示例:

public class ReferenceDemo {
    public static void main(String[] args) throws InterruptedException {
        //創建引用隊列
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue();
        //創建ReferenceDemo的虛引用
        PhantomReference<ReferenceDemo> phantomReference = new PhantomReference<>(new ReferenceDemo(), referenceQueue);
        //phantomReference.get()總是返回null
        System.out.println("phantomReference.get():" + phantomReference.get());
        //輪詢此隊列,查看是否有可用的Reference對象,有則返回該對象,否則返回null
        System.out.println("referenceQueue.poll():" + referenceQueue.poll());

        //觸發垃圾回收
        System.gc();
        //阻塞主線程,等待垃圾回收線程執行
        Thread.sleep(3000);
        System.out.println("------垃圾回收之后------");

        System.out.println("phantomReference.get():" + phantomReference.get());
        System.out.println("referenceQueue.poll():" + referenceQueue.poll());
    }
}

/*
 * 輸出結果:
 * phantomReference.get():null
 * referenceQueue.poll():null
 * ------垃圾回收之后------
 * phantomReference.get():null
 * referenceQueue.poll():java.lang.ref.PhantomReference@76fb509a
 */

關于Java中有哪些引用類型問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

出国| 高淳县| 张北县| 菏泽市| 嵩明县| 宁南县| 修文县| 高邮市| 浦东新区| 馆陶县| 景东| 内乡县| 堆龙德庆县| 子长县| 敖汉旗| 津市市| 达州市| 斗六市| 宝山区| 江永县| 漾濞| 桃园市| 丰台区| 宾阳县| 南充市| 大城县| 黄大仙区| 启东市| 四子王旗| 霍山县| 洮南市| 志丹县| 湘西| 资中县| 东兰县| 平原县| 怀远县| 金山区| 长武县| 惠东县| 阿克苏市|