最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java的引用類型常用的四種方法

 更新時(shí)間:2022年06月30日 08:54:08   作者:? 張國榮南京分榮?  ?  
這篇文章主要介紹了Java的引用類型常用的幾種方法,Java為引用類型專門定義了一個(gè)類Reference,它是引用對(duì)象的抽象基類,相關(guān)內(nèi)容需要的小伙伴可以參考一下

前言

今天看代碼看到有牽扯到弱引用的東西,就先稍微補(bǔ)一補(bǔ)Java的四種引用類型吧。Java為引用類型專門定義了一個(gè)類Reference,它是引用對(duì)象的抽象基類。

這個(gè)類定義了所有引用對(duì)象共有的操作。 由于這個(gè)類和垃圾收集器是息息相關(guān)的,這個(gè)類不能直接子類化。

Reference有4個(gè)子類,分別為強(qiáng)引用FinalReference、軟引用SoftReference、弱引用weakReference、虛引用PhantomReference。

意思就是這四種引用是在JVM中GC用的,我們工作寫代碼根本用不著。

強(qiáng)引用FinalReference

Object obj = new Object();

上面我們new了一個(gè)Object對(duì)象,并將其賦值給obj,這個(gè)obj就是new Object()的強(qiáng)引用。
Java中的引用默認(rèn)就是強(qiáng)引用。

強(qiáng)引用的特性是只要有強(qiáng)引用存在,被引用的對(duì)象就不會(huì)被垃圾回收。只有強(qiáng)引用不存在了,被引用的對(duì)象才會(huì)被垃圾回收。

寫個(gè)demo吧,新建一個(gè)BeanA,重寫finalize方法:

public class BeanA {
    @Override
    protected void finalize(){
        System.out.println("將對(duì)象從內(nèi)存中清除出去");
    }
}

然后寫個(gè)測(cè)試方法,將強(qiáng)引用置為空后,通知JVM垃圾回收。

    public static void main(String[] args) throws IOException {
        BeanA a = new BeanA();
        a=null;
        System.gc();
        //防止gc線程結(jié)束后還未執(zhí)行finalize方法
        System.in.read();
    }

輸出結(jié)果:將對(duì)象從內(nèi)存中清除出去。

可以看到強(qiáng)引用不存在了,被引用的對(duì)象是可以被垃圾回收的。

軟引用SoftReference

軟引用是用于描述一些有用但非必需的引用。

SoftReference的實(shí)例保存一個(gè)Java對(duì)象的軟引用,該軟引用的存在不影響垃圾回收線程對(duì)該Java對(duì)象的回收。

意思就是只有在內(nèi)存不足的情況下,被引用的對(duì)象才會(huì)被回收,內(nèi)存夠用是不會(huì)被回收的。

只要垃圾回收器沒有回收它,該對(duì)象就可以被程序使用。和這個(gè)軟引用是沒有關(guān)系的(即沒有將軟引用置空),只和內(nèi)存有關(guān)。

直接看demo:

public static void main(String[] args){
        SoftReference<byte[]> soft = new SoftReference<>(new byte[1024*1024*10]);
        System.out.println(soft.get());
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.gc();
        //注釋掉下面這句兩次get()方法都能獲取到
        //byte[] bytes = new byte[1024 * 1024 * 15];
        System.out.println(soft.get());
    }

我們創(chuàng)建了一個(gè)SoftReference對(duì)象,其變量名soft強(qiáng)引用著這個(gè)SoftReference對(duì)象,而這個(gè)SoftReference對(duì)象則保存著一個(gè)軟引用,這個(gè)軟引用引用的是一個(gè)10M的數(shù)組。

當(dāng)然這個(gè)10M數(shù)組也可以替換成自己新建的對(duì)象:

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

這樣的話SoftReference對(duì)象中保存的a就變成了軟引用,如果內(nèi)存足夠的話,將a=null,GC后使用soft.get還是可以獲取到該對(duì)象。

我們這里使用10M數(shù)組來測(cè)試,啟動(dòng)測(cè)試類設(shè)定VM內(nèi)存20M,發(fā)現(xiàn)再新建一個(gè)15M數(shù)組后會(huì)將原來的10M數(shù)組給GC掉。

輸出結(jié)果:

[B@2cfb4a64
[B@2cfb4a64

[B@2cfb4a64
null

總結(jié)一句話就是:創(chuàng)建強(qiáng)引用時(shí)內(nèi)存不夠就把軟引用占的內(nèi)存給回收掉。

總結(jié)一個(gè)詞就是:欺軟怕硬。

另外軟引用非常適合緩存使用。

弱引用weakReference

弱引用和軟引用很類似,不同的是弱引用引用的對(duì)象只要垃圾回收?qǐng)?zhí)行,就會(huì)被回收,而不管是否內(nèi)存不足。

我demo沒有設(shè)定vm:Xmx=20M,通知JVM進(jìn)行垃圾回收后依然會(huì)將被引用對(duì)象回收掉。

    public static void main(String[] args){
       WeakReference<byte[]> soft = new WeakReference<>(new byte[1024*1024*10]);
        System.out.println(soft.get());
        //通知JVM進(jìn)行垃圾回收
        System.gc();
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(soft.get());
    }

輸出結(jié)果:

[B@2cfb4a64
null

虛引用PhantomReference

首先,虛引用是無法通過get方法來獲取的。一個(gè)虛引用對(duì)象被回收時(shí)會(huì)被放在一個(gè)ReferenceQueue隊(duì)列中,意思就是虛引用回收時(shí)會(huì)給出一個(gè)信號(hào)放在隊(duì)列中。

        ReferenceQueue<Object> rq = new ReferenceQueue<>();
        Object obj = new Object();
        PhantomReference<Object> phantomReference = new PhantomReference<>(obj,rq);
        obj = null;
        System.out.println("Reference: "+phantomReference.get());
        System.gc();
        Reference<Object> r = (Reference<Object>)rq.poll();
        System.out.println("ReferenceQueue:  "+r);

輸出結(jié)果兩個(gè)null。只有VM內(nèi)存不足時(shí)才會(huì)回收這個(gè)虛引用,才會(huì)將其放在隊(duì)列中,才能通過poll()獲取到隊(duì)列中的PhantomReference對(duì)象,而這個(gè)引用對(duì)象需要程序員自己進(jìn)行特殊處理。

那問題來了,甭管G不GC我都拿不到它,那它有啥用?

其實(shí)它一般用來管理直接內(nèi)存,我們的垃圾回收器是在JVM中管理內(nèi)存的,如果我們從網(wǎng)絡(luò)中下載一個(gè)文件保存在os的內(nèi)存中,而 新版JVM不需要copy一份到j(luò)vm內(nèi)存中,通過引用可以直接訪問操作系統(tǒng)管理的內(nèi)存,當(dāng)我們回收這個(gè)虛引用時(shí),則會(huì)在隊(duì)列中放入這個(gè)引入對(duì)象,方便用來特殊處理。

到此這篇關(guān)于Java的引用類型常用的四種方法的文章就介紹到這了,更多相關(guān)Java引用類型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java之HashMap案例詳解

    Java之HashMap案例詳解

    這篇文章主要介紹了Java之HashMap案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Mybatis的xml文件時(shí)間范圍條件查詢方式

    Mybatis的xml文件時(shí)間范圍條件查詢方式

    這篇文章主要介紹了Mybatis的xml文件時(shí)間范圍條件查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Java求兩集合的交集、并集、差集實(shí)例

    Java求兩集合的交集、并集、差集實(shí)例

    這篇文章主要介紹了Java求兩集合的交集、并集、差集實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • java實(shí)現(xiàn)上傳和下載工具類

    java實(shí)現(xiàn)上傳和下載工具類

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)上傳和下載工具類,文件上傳到ftp服務(wù)工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Maven倉庫加載順序的實(shí)例解析

    Maven倉庫加載順序的實(shí)例解析

    Maven倉庫一般分為本地倉庫和遠(yuǎn)程倉庫。那么在實(shí)際開發(fā)中,在配置了多個(gè)倉庫的情況下,他們之間的加載訪問順序是怎么樣的呢,本文就詳細(xì)的來介紹一下
    2021-12-12
  • Mybatis 傳輸List的實(shí)現(xiàn)代碼

    Mybatis 傳輸List的實(shí)現(xiàn)代碼

    本文通過實(shí)例代碼給大家介紹了mybatis傳輸list的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-09-09
  • SpringSceurity實(shí)現(xiàn)短信驗(yàn)證碼登陸

    SpringSceurity實(shí)現(xiàn)短信驗(yàn)證碼登陸

    這篇文章主要介紹了SpringSceurity實(shí)現(xiàn)短信驗(yàn)證碼登陸,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Mybatis中的mapper模糊查詢語句LIKE

    Mybatis中的mapper模糊查詢語句LIKE

    這篇文章主要介紹了Mybatis中的mapper模糊查詢語句LIKE,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2021-12-12
  • spring boot定時(shí)器實(shí)現(xiàn)定時(shí)同步數(shù)據(jù)的操作步驟

    spring boot定時(shí)器實(shí)現(xiàn)定時(shí)同步數(shù)據(jù)的操作步驟

    在Java中,@Scheduled注解是用于指定定時(shí)任務(wù)的執(zhí)行規(guī)則的,這篇文章給大家介紹spring boot定時(shí)器實(shí)現(xiàn)定時(shí)同步數(shù)據(jù)的操作步驟,感興趣的朋友一起看看吧
    2023-12-12
  • Java合并集合幾種常見方式總結(jié)(List、Set、Map)

    Java合并集合幾種常見方式總結(jié)(List、Set、Map)

    這篇文章主要介紹了Java中合并List、Set、Map的多種方法,包括addAll()、Stream.concat()、Stream.of()+flatMap()、List.copyOf()、putAll()、merge()、compute()和StreamAPI等,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03

最新評(píng)論

韩城市| 射洪县| 普兰店市| 日照市| 聊城市| 贵州省| 连江县| 光山县| 克东县| 凯里市| 海原县| 寻甸| 赤城县| 辽阳县| 修武县| 洪江市| 五寨县| 三河市| 寻甸| 濮阳市| 兴隆县| 远安县| 邵东县| 建始县| 清丰县| 庆阳市| 高陵县| 楚雄市| 永州市| 桐庐县| 育儿| 大埔区| 桑日县| 开远市| 清远市| 景泰县| 晋宁县| 荆门市| 临城县| 兴宁市| 宣汉县|