java堆污染是什么

這篇文章主要介紹“java堆污染是什么”,在日常操作中,相信很多人在java堆污染是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”java堆污染是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)作為成都網(wǎng)站建設(shè)公司,專注網(wǎng)站建設(shè)公司、網(wǎng)站設(shè)計(jì),有關(guān)成都定制網(wǎng)站方案、改版、費(fèi)用等問(wèn)題,行業(yè)涉及混凝土攪拌站等多個(gè)領(lǐng)域,已為上千家企業(yè)服務(wù),得到了客戶的尊重與認(rèn)可。

簡(jiǎn)介

什么是堆污染呢?堆污染是指當(dāng)參數(shù)化類型變量引用的對(duì)象不是該參數(shù)化類型的對(duì)象時(shí)而發(fā)生的。

我們知道在JDK5中,引入了泛型的概念,我們可以在創(chuàng)建集合類的時(shí)候,指定該集合類中應(yīng)該存儲(chǔ)的對(duì)象類型。

如果在指定類型的集合中,引用了不同的類型,那么這種情況就叫做堆污染。

產(chǎn)生堆污染的例子

有同學(xué)可能會(huì)問(wèn)了,既然JDK5引入了泛型,為什么還會(huì)出現(xiàn)堆污染呢?

這是一個(gè)好問(wèn)題,讓我們看一個(gè)例子:

    public void heapPollution1(){
        List normalList= Arrays.asList("www.flydean.com",100);
        List<Integer> integerList= normalList;
    }

上面的例子中,我們使用Arrays.asList創(chuàng)建了一個(gè)普通的List。

這個(gè)List中包含了int和String兩種類型,當(dāng)我們將List賦值給List<Integer>的時(shí)候,java編譯器并不會(huì)去判斷賦值List中的類型,integerList中包含了非Integer的元素,最終導(dǎo)致在使用的時(shí)候會(huì)出現(xiàn)錯(cuò)誤。

直接給List<Integer>賦值不會(huì)進(jìn)行類型檢查,那么如果我們是直接向List<Integer>中添加元素呢?

我們看下下面的例子:

    private void addToList(List list, Object object){
        list.add(object);
    }

    [@Test](https://my.oschina.net/azibug)
    public void heapPollution2(){
        List<Integer> integerList=new ArrayList<>();
        addToList(integerList,"www.flydean.com");
    }

上面的例子中,我們定義了一個(gè)addToList方法,這個(gè)方法的參數(shù)是一個(gè)普通的List,但是我們傳入了一個(gè)List<Integer>。

結(jié)果,我們發(fā)現(xiàn)list.add方法并沒(méi)有進(jìn)行參數(shù)類型校驗(yàn)。

上面的例子該怎么修改呢?

我們需要在addToList方法的List參數(shù)中,也添加上類型校驗(yàn):

    private void addToList(List<Integer> list, Object object){
        list.add(object);
    }

如果addToList是一個(gè)非常通用的方法怎么辦呢?在addToList的參數(shù)中添加參數(shù)類型是現(xiàn)實(shí)的。

這個(gè)時(shí)候,我們可以考慮使用Collections.checkedList方法來(lái)將輸入的List轉(zhuǎn)換成為一個(gè)checkedList,從而只接收特定類型的元素。

    public void heapPollutionRight(){
        List<Integer> integerList=new ArrayList<>();
        List<Integer> checkedIntegerList= Collections.checkedList(integerList, Integer.class);
        addToList(checkedIntegerList,"www.flydean.com");
    }

運(yùn)行上面的代碼,我們將會(huì)得到下面的異常:

java.lang.ClassCastException: Attempt to insert class java.lang.String element into collection with element type class java.lang.Integer

更通用的例子

上面我們定義了一個(gè)addToList方法,因?yàn)闆](méi)有做類型判斷,所以可能會(huì)出現(xiàn)堆污染的問(wèn)題。

有沒(méi)有什么辦法既可以通用,又可以避免堆污染呢?

當(dāng)然有的,我們看下面的實(shí)現(xiàn):

    private <T> void addToList2(List<T> list, T t) {
        list.add(t);
    }

    public <T> void heapPollutionRight2(T element){
        List<T> list = new ArrayList<>();
        addToList2(list,element);
    }

上面的例子中,我們?cè)赼ddToList方法中定義了一個(gè)參數(shù)類型T,通過(guò)這樣,我們保證了List中的元素類型的一致性。

可變參數(shù)

事實(shí)上,方法參數(shù)可以是可變的,我們考慮下面的例子:

    private void addToList3(List<Integer>... listArray){
        Object[] objectArray = listArray;
        objectArray[0]= Arrays.asList("www.flydean.com");
        for(List<Integer> integerList: listArray){
            for(Integer element: integerList){
                System.out.println(element);
            }
        }
    }

上面的例子中我們的參數(shù)是一個(gè)List的數(shù)組,雖然List中的元素類型固定了,但是我們可以重新賦值給參數(shù)數(shù)組,從而實(shí)際上修改掉參數(shù)類型。

如果上面addToList3的方法參數(shù)修改為下面的方式,就不會(huì)出現(xiàn)問(wèn)題了:

private void addToList4(List<List<Integer>> listArray){

這種情況下,List的類型是固定的,我們無(wú)法通過(guò)重新賦值的方式來(lái)修改它。

到此,關(guān)于“java堆污染是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

文章名稱:java堆污染是什么
轉(zhuǎn)載源于:http://muchs.cn/article46/ijohhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)頁(yè)設(shè)計(jì)公司、微信公眾號(hào)、虛擬主機(jī)網(wǎng)站營(yíng)銷、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司