java提高篇(十八)-----數組之一:認識JAVA數組

來源:互聯網
上載者:User

標籤:

    噢,它明白了,河水既沒有牛伯伯說的那麼淺,也沒有小松鼠說的那麼深,只有自己親自試過才知道!道聽途說永遠只能看到表明現象,只有親自試過了,才知道它的深淺!!!!!

一、什麼是數組

     數組?什麼是數組?在我印象中的數組是應該這樣的:通過new關鍵字建立並組裝他們,通過使用整形索引值訪問它的元素,並且它的尺寸是不可變的!

      但是這隻是數組的最表面的東西!深一點?就是這樣:數組是一個簡單的複合資料型別,它是一系列有序資料的集合,它當中的每一個資料都具有相同的資料類型,我們通過數組名加上一個不會越界下標值來唯一確定數組中的元素。

      還有更深的,那就是數組是一個特殊的對象!!(對於這個LZ理解的不是很好,對JVM也沒有看,所以見解有限)。以下參考文獻:http://developer.51cto.com/art/201001/176671.htm、http://www.blogjava.net/flysky19/articles/92763.html?opt=admin

      不管在其他語言中數組是什麼,在java中它就是對象。一個比較特殊的對象。

public class Test {    public static void main(String[] args) {        int[] array = new int[10];        System.out.println("array的父類是:" + array.getClass().getSuperclass());        System.out.println("array的類名是:" + array.getClass().getName());    }}-------Output:array的父類是:class java.lang.Objectarray的類名是:[I

      從上面樣本可以看出,數組的是Object的直接子類,它屬於“第一類對象”,但是它又與普通的java對象存在很大的不同,從它的類名就可以看出:[I,這是什麼東東??在JDK中我就沒有找到這個類,話說這個"[I”都不是一個合法標識符。怎麼定義成類啊?所以我認為SUM那幫天才肯定對數組的底層肯定做了特殊的處理。

      我們再看如下樣本:

public class Test {    public static void main(String[] args) {        int[] array_00 = new int[10];        System.out.println("一維數組:" + array_00.getClass().getName());        int[][] array_01 = new int[10][10];        System.out.println("二維數組:" + array_01.getClass().getName());                int[][][] array_02 = new int[10][10][10];        System.out.println("三維數組:" + array_02.getClass().getName());    }}-----------------Output:一維數組:[I二維數組:[[I三維數組:[[[I

      通過這個執行個體我們知道:[代表了數組的維度,一個[表示一維,兩個[表示二維。可以簡單的說數組的類名由若干個‘[‘和數組元素類型的內部名稱組成。不清楚我們再看:

public class Test {    public static void main(String[] args) {        System.out.println("Object[]:" + Object[].class);        System.out.println("Object[][]:" + Object[][].class);        System.err.println("Object[][][]:" + Object[][][].class);        System.out.println("Object:" + Object.class);    }}---------Output:Object[]:class [Ljava.lang.Object;Object[][]:class [[Ljava.lang.Object;Object[][][]:class [[[Ljava.lang.Object;Object:class java.lang.Object

      從這個執行個體我們可以看出數組的“廬山真面目”。同時也可以看出數組和普通的Java類是不同的,普通的java類是以全限定路徑名+類名來作為自己的唯一標示的,而數組則是以若干個[+L+數組元素類全限定路徑+類來最為唯一標示的。這個不同也許在某種程度上說明了數組也普通java類在實現上存在很大的區別,也許可以利用這個區別來使得JVM在處理數組和普通java類時作出區分。

     我們暫且不論這個[I是什麼東東,是由誰來聲明的,怎麼聲明的(這些我現在也不知道!但是有一點可以確認:這個是在運行時確定的)。先看如下:

public class Test {    public static void main(String[] args) {        int[] array = new int[10];        Class clazz = array.getClass();           System.out.println(clazz.getDeclaredFields().length);           System.out.println(clazz.getDeclaredMethods().length);           System.out.println(clazz.getDeclaredConstructors().length);           System.out.println(clazz.getDeclaredAnnotations().length);           System.out.println(clazz.getDeclaredClasses().length);       }}----------------Output:00000

      從這個運行結果可以看出,我們親愛的[I沒有生命任何成員變數、成員方法、建構函式、Annotation甚至連length成員變數這個都沒有,它就是一個徹徹底底的空類。沒有聲明length,那麼我們array.length時,編譯器怎麼不會報錯呢?確實,數組的length是一個非常特殊的成員變數。我們知道數組的是Object的直接之類,但是Object是沒有length這個成員變數的,那麼length應該是數組的成員變數,但是從上面的樣本中,我們發現數組根本就沒有任何成員變數,這兩者不是相互矛盾嗎?

public class Main {    public static void main(String[] args) {        int a[] = new int[2];        int i = a.length;    }}

      開啟class檔案,得到main方法的位元組碼:

0 iconst_2                   //將int型常量2壓入運算元棧      1 newarray 10 (int)          //將2彈出運算元棧,作為長度,建立一個元素類型為int, 維度為1的數組,並將數組的引用壓入運算元棧      3 astore_1                   //將數組的引用從運算元棧中彈出,儲存在索引為1的局部變數(即a)中      4 aload_1                    //將索引為1的局部變數(即a)壓入運算元棧      5 arraylength                //從運算元棧彈出數組引用(即a),並擷取其長度(JVM負責實現如何擷取),並將長度壓入運算元棧      6 istore_2                   //將數組長度從運算元棧彈出,儲存在索引為2的局部變數(即i)中      7 return                     //main方法返回

      在這個位元組碼中我們還是沒有看到length這個成員變數,但是看到了這個:arraylength ,這條指令是用來擷取數組的長度的,所以說JVM對數組的長度做了特殊的處理,它是通過arraylength這條指令來實現的。

二、數組的使用方法

      通過上面算是對數組是什麼有了一個初步的認識,下面將簡單介紹數組的使用方法。

      數組的使用方法無非就是四個步驟:聲明數組、分配空間、賦值、處理。

      聲明數組:就是告訴電腦數組的類型是什麼。有兩種形式:int[] array、int array[]。

      分配空間:告訴電腦需要給該數組分配多少連續的空間,記住是連續的。array = new int[10];

      賦值:賦值就是在已經分配的空間裡面放入資料。array[0] = 1 、array[1] = 2……其實分配空間和賦值是一起進行的,也就是完成數組的初始化。有如下三種形式:

int a[] = new int[2];    //預設為0,如果是引用資料類型就為null        int b[] = new int[] {1,2,3,4,5};            int c[] = {1,2,3,4,5};

      處理:就是對數組元素進行操作。通過數組名+有效下標來確認資料。

 

     PS:由於能力有限,所以“什麼是數組”主要是參考這篇博文:http://developer.51cto.com/art/201001/176671.htm。下篇將更多的介紹數組的一些特性,例如:效率問題、Array的使用、淺拷貝以及與list之間的轉換問題。

 

java提高篇(十八)-----數組之一:認識JAVA數組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.