在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Java/ 數(shù)組之一:認(rèn)識(shí) JAVA 數(shù)組
Java 集合細(xì)節(jié)(四):保持 compareTo 和 equals 同步
Iterator
使用序列化實(shí)現(xiàn)對(duì)象的拷貝
fail-fast 機(jī)制
關(guān)鍵字 final
Vector
HashTable
Java 集合細(xì)節(jié)(一):請(qǐng)為集合指定初始容量
強(qiáng)制類型轉(zhuǎn)換
數(shù)組之一:認(rèn)識(shí) JAVA 數(shù)組
Java 集合細(xì)節(jié)(三):subList 的缺陷
hashCode
ArrayList
數(shù)組之二
List 總結(jié)
LinkedList
Java 提高篇(九)—–實(shí)現(xiàn)多重繼承
Java 的四舍五入
關(guān)鍵字 static
理解 Java 的三大特性之多態(tài)
抽象類與接口
集合大家族
異常(二)
Java 集合細(xì)節(jié)(二):asList 的缺陷
Map 總結(jié)
TreeSet
equals() 方法總結(jié)
Java 提高篇(十)—–詳解匿名內(nèi)部類
HashMap
Stack
詳解內(nèi)部類
TreeMap
異常(一)
詳解 Java 定時(shí)任務(wù)
HashSet
字符串
理解 Java 的三大特性之繼承
理解 Java 的三大特性之封裝
代碼塊

數(shù)組之一:認(rèn)識(shí) JAVA 數(shù)組

噢,它明白了,河水既沒(méi)有牛伯伯說(shuō)的那么淺,也沒(méi)有小松鼠說(shuō)的那么深,只有自己親自試過(guò)才知道!道聽(tīng)途說(shuō)永遠(yuǎn)只能看到表明現(xiàn)象,只有親自試過(guò)了,才知道它的深淺!?。。。?/code>

一、什么是數(shù)組

數(shù)組?什么是數(shù)組?在我印象中的數(shù)組是應(yīng)該這樣的:通過(guò) new 關(guān)鍵字創(chuàng)建并組裝他們,通過(guò)使用整形索引值訪問(wèn)它的元素,并且它的尺寸是不可變的!

但是這只是數(shù)組的最表面的東西!深一點(diǎn)?就是這樣:數(shù)組是一個(gè)簡(jiǎn)單的復(fù)合數(shù)據(jù)類型,它是一系列有序數(shù)據(jù)的集合,它當(dāng)中的每一個(gè)數(shù)據(jù)都具有相同的數(shù)據(jù)類型,我們通過(guò)數(shù)組名加上一個(gè)不會(huì)越界下標(biāo)值來(lái)唯一確定數(shù)組中的元素。

還有更深的,那就是數(shù)組是一個(gè)特殊的對(duì)象?。。▽?duì)于這個(gè) LZ 理解的不是很好,對(duì)JVM也沒(méi)有看,所以見(jiàn)解有限)。以下參考文獻(xiàn):http://developer.51cto.com/art/201001/176671.htm、http://www.blogjava.net/flysky19/articles/92763.html?opt=admin

不管在其他語(yǔ)言中數(shù)組是什么,在 Java 中它就是對(duì)象。一個(gè)比較特殊的對(duì)象。


    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.Object
    array的類名是:[I

從上面示例可以看出,數(shù)組的是 Object 的直接子類,它屬于“第一類對(duì)象”,但是它又與普通的 Java 對(duì)象存在很大的不同,從它的類名就可以看出:[I,這是什么東東??在 JDK 中我就沒(méi)有找到這個(gè)類,話說(shuō)這個(gè)”[I”都不是一個(gè)合法標(biāo)識(shí)符。怎么定義成類?。克晕艺J(rèn)為 SUM 那幫天才肯定對(duì)數(shù)組的底層肯定做了特殊的處理。

我們?cè)倏慈缦率纠?/p>


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

            int[][][] array_02 = new int[10][10][10];
            System.out.println("三維數(shù)組:" + array_02.getClass().getName());
        }
    }
    -----------------Output:
    一維數(shù)組:[I
    二維數(shù)組:[[I
    三維數(shù)組:[[[I

通過(guò)這個(gè)實(shí)例我們知道:[代表了數(shù)組的維度,一個(gè)[表示一維,兩個(gè)[表示二維。可以簡(jiǎn)單的說(shuō)數(shù)組的類名由若干個(gè)’[‘和數(shù)組元素類型的內(nèi)部名稱組成。不清楚我們?cè)倏矗?/p>


    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

從這個(gè)實(shí)例我們可以看出數(shù)組的“廬山真面目”。同時(shí)也可以看出數(shù)組和普通的 Java 類是不同的,普通的 Java 類是以全限定路徑名 + 類名來(lái)作為自己的唯一標(biāo)示的,而數(shù)組則是以若干個(gè) [+L+ 數(shù)組元素類全限定路徑+類來(lái)最為唯一標(biāo)示的。這個(gè)不同也許在某種程度上說(shuō)明了數(shù)組也普通 Java 類在實(shí)現(xiàn)上存在很大的區(qū)別,也許可以利用這個(gè)區(qū)別來(lái)使得 JVM 在處理數(shù)組和普通 Java 類時(shí)作出區(qū)分。

我們暫且不論這個(gè)[I 是什么東東,是由誰(shuí)來(lái)聲明的,怎么聲明的(這些我現(xiàn)在也不知道!但是有一點(diǎn)可以確認(rèn):這個(gè)是在運(yùn)行時(shí)確定的)。先看如下:


    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:
    0
    0
    0
    0
    0

從這個(gè)運(yùn)行結(jié)果可以看出,我們親愛(ài)的 [I 沒(méi)有生命任何成員變量、成員方法、構(gòu)造函數(shù)、Annotation 甚至連 length 成員變量這個(gè)都沒(méi)有,它就是一個(gè)徹徹底底的空類。沒(méi)有聲明 length,那么我們 array.length 時(shí),編譯器怎么不會(huì)報(bào)錯(cuò)呢?確實(shí),數(shù)組的 length 是一個(gè)非常特殊的成員變量。我們知道數(shù)組的是 Object 的直接之類,但是 Object 是沒(méi)有 length 這個(gè)成員變量的,那么 length 應(yīng)該是數(shù)組的成員變量,但是從上面的示例中,我們發(fā)現(xiàn)數(shù)組根本就沒(méi)有任何成員變量,這兩者不是相互矛盾么?


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

打開(kāi) class 文件,得到 main 方法的字節(jié)碼:


    0 iconst_2                   //將int型常量2壓入操作數(shù)棧  
        1 newarray 10 (int)          //將2彈出操作數(shù)棧,作為長(zhǎng)度,創(chuàng)建一個(gè)元素類型為int, 維度為1的數(shù)組,并將數(shù)組的引用壓入操作數(shù)棧  
        3 astore_1                   //將數(shù)組的引用從操作數(shù)棧中彈出,保存在索引為1的局部變量(即a)中  
        4 aload_1                    //將索引為1的局部變量(即a)壓入操作數(shù)棧  
        5 arraylength                //從操作數(shù)棧彈出數(shù)組引用(即a),并獲取其長(zhǎng)度(JVM負(fù)責(zé)實(shí)現(xiàn)如何獲取),并將長(zhǎng)度壓入操作數(shù)棧  
        6 istore_2                   //將數(shù)組長(zhǎng)度從操作數(shù)棧彈出,保存在索引為2的局部變量(即i)中  
        7 return                     //main方法返回

在這個(gè)字節(jié)碼中我們還是沒(méi)有看到 length 這個(gè)成員變量,但是看到了這個(gè):arraylength ,這條指令是用來(lái)獲取數(shù)組的長(zhǎng)度的,所以說(shuō) JVM 對(duì)數(shù)組的長(zhǎng)度做了特殊的處理,它是通過(guò) arraylength 這條指令來(lái)實(shí)現(xiàn)的。

二、數(shù)組的使用方法

通過(guò)上面算是對(duì)數(shù)組是什么有了一個(gè)初步的認(rèn)識(shí),下面將簡(jiǎn)單介紹數(shù)組的使用方法。

數(shù)組的使用方法無(wú)非就是四個(gè)步驟:聲明數(shù)組、分配空間、賦值、處理。

聲明數(shù)組:就是告訴計(jì)算機(jī)數(shù)組的類型是什么。有兩種形式:int[] array、int array[]。

分配空間:告訴計(jì)算機(jī)需要給該數(shù)組分配多少連續(xù)的空間,記住是連續(xù)的。array = new int[10];

賦值:賦值就是在已經(jīng)分配的空間里面放入數(shù)據(jù)。array[0] = 1 、array[1] = 2…… 其實(shí)分配空間和賦值是一起進(jìn)行的,也就是完成數(shù)組的初始化。有如下三種形式:


    int a[] = new int[2];    //默認(rèn)為0,如果是引用數(shù)據(jù)類型就為 null
            int b[] = new int[] {1,2,3,4,5};    
            int c[] = {1,2,3,4,5};

處理:就是對(duì)數(shù)組元素進(jìn)行操作。通過(guò)數(shù)組名+有效的下標(biāo)來(lái)確認(rèn)數(shù)據(jù)。

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