日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java提高篇之数组(1):认识JAVA数组

發布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java提高篇之数组(1):认识JAVA数组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、什么是數組

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

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

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

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

1 2 3 4 5 6 7 8 9 10 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

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

????? 我們再看如下示例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 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是什么東東,是由誰來聲明的,怎么聲明的(這些我現在也不知道!但是有一點可以確認:這個是在運行時確定的)。先看如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 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

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

1 2 3 4 5 6 public class Main { ????public static void main(String[] args) { ????????int a[] = new int[2]; ????????int i = a.length; ????} }

????? 打開class文件,得到main方法的字節碼:

1 2 3 4 5 6 7 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……其實分配空間和賦值是一起進行的,也就是完成數組的初始化。有如下三種形式:

1 2 3 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之間的轉換問題。



from:?http://www.importnew.com/20666.html

總結

以上是生活随笔為你收集整理的java提高篇之数组(1):认识JAVA数组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。