天天看點

談談數組

在說說equals(上) 這篇文章裡,文末提到String底層是char數組來實作的,好多人當年上學時被二維數組,三維數組吓哭了吧。我們今天來講講數組,數組非常的重要,很多常用類,比如String等底層都是用數組來實作的,後續我們會一一講到,多少人很久沒用數組了?是否都在用ArrayList呀?這兒先賣個關子,ArrayList底層也是數組實作的。

所謂數組,是相同資料類型的元素按一定順序排列的集合。現在我們來看一看數組在記憶體中的樣子,話不多說,上代碼:

public static void main(String[] args) {
        char[] charArr1 = {'a', 'b', 'c'};
        char[] charArr2 = new char[]{'圖', '解', 'J', 'A', 'V', 'A'};
        char[] charArr3 = new char[5];
        charArr3[0] = '1';
        charArr3[1] = '0';
        charArr3[2] = '0';
        charArr3[3] = '8';
        charArr3[4] = '6';

        System.out.println(charArr1);
        System.out.println(charArr2) ;
        System.out.println(charArr3);
 }      

先編譯一下,我們打開編譯好的class檔案,反編譯一下看看:

談談數組

三種數組的聲明方式編譯後,最後建立的方式都是一樣的,都給我們加了new關鍵字,順手還把charArr3的聲明與指派一體化了,編譯器你管得也太多了吧。用IDE的代碼聯想功能看一下:

談談數組

恩,沒錯,Object類有的方法它都有,它還多了一個length屬性(注意不是方法)。個人認為,在Java層面,我們完全可以把數組當成對象來看待,下圖我們模拟一下數組在堆記憶體中的大緻的樣子,每一個數組都是按順序排列在堆記憶體中,正因為如此,我們可以通過數組+[下标]的方式來直接通路數組裡的元素。

談談數組

我們再來看看二維數組:

談談數組

這裡還是用了三種方式去聲明,還是反編譯class檔案看一下,雖然有點差别,但還是大同小異,都給我們加了new關鍵字(這次沒有把我們的z數組和指派一體化)。

談談數組

老規矩,我們畫一畫。

嘿嘿,不就是數組裡面套數組嘛,不要被二維這兩個字給吓到了,哪有什麼二維數組,其實就是二級數組而已。上圖中隻畫出了數組x,有興趣的朋友可以自行畫一下y和z。

談談數組