深入研究JAVA數據結構跟算法系列(二)——數組進階(數組移除元素)

引言:

    筆者在學習Java數據結果跟算法的過程中,知道數組在數據結構跟算法中是很重要地存在,只有對數組有相當的認知以後才能說自己對這一模塊才能說熟悉掌握,但凡在任何語言當中,學習用本質看現象才能更好的去解決更多的問題,也是走向更高的一層打下紮實的基礎。

      那麼我們說通過本質看現象是有相當的要求,不扯了。下面我們來看看Java數據結構當中的數組是怎麼實現移除或者說刪除數組元素的,在ArrayList當中是現在操作的,其中存在什麼陷阱跟誤解。

      數組在heap內存中是一段連續的空間,裏面存放着相同的類型的元素 這個是我們在定義的時候指定的,我的猜測是做移除的時候 會重新定義一個新的內存空間,然後把當前這個數組的不爲空的元素挨個盤的的存放進去,生成一個新的數組對象,然後把指針指向當前的這個數組對象(這即是Java的複製本質)。這樣子做的好處是把沒有用內存給清除掉,這也是爲什麼數組在刪除元素的時候回比較慢的原因,只是引用的地址發生了改變,等待的即是GC來把這個源數組給回收。

    下面我們來看看實驗:

class TestCopy{

    public static void main(String[] args) {

        Object[] src = {1,3,5,7,9,10,15,18};
        System.out.println(src.length);
        TestCopy.arrayCopy(src,4,src,3,4);

        for (int i = 0; i < src.length; i++) {
            System.out.print(src[i]+"\t");
        }
        System.out.println();
        System.out.println(src.length);
    }

    /**
     * 複製在Java中不一定是存在對象的丟失或者指向的改變
     * @param src
     * @param srcIndex
     * @param dest
     * @param destIndex
     */
    private static void arrayCopy(Object[] src,int srcIndex,Object[] dest,int destIndex,int length){
        for (int i = 0; i < length; i++) {
            dest[destIndex] = src[srcIndex];
            destIndex++;
            srcIndex++;
        }
        src[7] = null;
        System.gc();
    }
}

打印結果


上面這個只是對一個數組對象做複製的算法,不存在對象重新引用,其實這個就是ArraryList的remove的實現原理。這就是他爲什麼基於array來開發的,其實數組對象在初始化分配的時候他的長度就固定的(初始化給了值),他在內存在本身即是一段連續空間存在,remove方法只是把數組裏面的內容移除,並不存在內存被回收的情況,所以裏面的元素 就是我們經常說的size會發生改變,而length是不改變的,這本身就很客觀,因爲數組本身即是有一定容量的容器,有增有減。

我們來看看ArrayList的這個操作:


我上面做了一個實驗,算法執行完以後  把最後一個值賦值爲null,然後在做GC,但是控制檯打印出來並沒有回收這塊內存

不過沒有回收纔是正常的,被回收的話那麼則該對象的屬性length就會發現變化 ,所以我對這個註釋辨識持有懷疑。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章