java 初學者必看

金科APP社團_王麗娟發表於2013-12-06
Java陣列(初學者必看) 分享到: 12本文由 ImportNew - 劉志軍 翻譯自 javarevisited。如需轉載本文,請先參見文章末尾處的轉載要求。陣列無論在哪種程式語言中都算是最重要的資料結構之一,同時不同語言的實現及處理也不盡相同。但凡寫過一些程式的人都知道陣列的價值及理解陣列的重要性,與連結串列一道,陣列成為了基本的資料結構。儘管Java提供了很棒的集合API和集合類如:ArrayList、HashMap,他們內部都是基於陣列。如果你是來自於基於c或c++背景的程式設計師,那麼你會發現一些關於陣列的行為和如何在Java工作中的異同。最值得注意的是C中的陣列與Java中的陣列的邊界檢查,c編譯器不檢查如果程式訪問無效的陣列索引,而java如果程式嘗試訪問無效的陣列索引的話jvm會丟擲ArrayIndexOutOfBoundException。在這篇文章中,我們看看Java中的陣列,包括原生型別和物件型別的陣列,下面就介紹些有關Java陣列及屬性的知識點。Java陣列101(譯註:101指介紹某件事,讀者不需要任何預備知識)1)陣列在Java中是一個物件,陣列例項同樣是使用new操作符建立的。Array.length指定了陣列長度,例如:1234 int[] intArray = new int[10]; System.out.println(intArray.length) Output: 10 Array.length 表示陣列的容量,只要陣列建立了,每一個索引被初始化為預設值。2)陣列索引起始為0,負數索引在Java中是無效的,會丟擲ArrayIndexOutOfBoundException ,如果你嘗試用無效的索引訪問陣列,這個無效的索引可能是一個負索引,或者是大於等於陣列長度的索引。3)陣列儲存在Java堆的連續記憶體空間,所以如果你建立一個大的索引,你可以有足夠的堆空間直到丟擲OutofmemoryError,因為請求的記憶體大小在連續的記憶體空間不可用。4)陣列一個固定長度 的資料結構,一旦宣告,你不能改變陣列的長度。5)不同型別的陣列有不同的型別,例如下面例子,intArray.getClass()不同於floatArray.getClass()12 int[] intArray = new int[10]; float[] floatArray = new float[10]; 1 6)你不能儲存double值在int陣列中,否則導致編譯錯誤。 12 int[] intArray = new int[10]; intArray[5]=1.2; //compilation error 如果嘗試在執行時做這個操作,那麼Java丟擲ArrayStoreException7)在Java陣列中可以有不同方式的建立方式,這裡就是建立陣列的例子:1234 int[] intArray; //creating array without initializing or specifying size int intArray1[]; //another int[] reference variable can hold reference of an integer array int[] intArray2 = new int[10]; //creating array by specifying size int[] intArray3 = new int[]{1,2,3,4}; //creating and initializing array in same line. 你既可以選擇在建立陣列的時候初始化陣列,也可以以後通過for迴圈初始化,中括號既可以在變數的前面也可以在變數後面。第一種方法是方便的建立多個陣列如:int[] array1, array2這裡的array1和array2是整型陣列,而第二種方法你需要放兩次括號如:int array1[], array2[]儘管在風格上沒有很多不同,我讀“int[] ”叫int陣列,這種寫法更容易被理解。8)如果沒有明確的初始化陣列元素,那麼陣列就會用預設的型別值初始化,例如假若沒有初始化整型陣列,元素都將預設值為0,沒有初始化的boolean值是false,物件陣列是null。9)你可以通過使用[]操作符訪問陣列元素,因為陣列索引起始於0,[0]返回第一個元素,[length-1]返回最後一個元素,for迴圈是一種迭代整個陣列便捷方法。你可以使用for迴圈初始化整個陣列、訪問的每個索引或更新、獲取陣列元素。Java5同樣提供了加強的for迴圈,陣列自己管理索引,防止ArrayIndexOutOfBoundException,這裡是一個迭代的例子:傳統的方式:123456789101112 int[] numbers = new int[]{10, 20, 30, 40, 50}; for (int i = 0; i < numbers.length; i++) { System.out.println("element at index " + i + ": " + numbers[i]); } Output: element at index 0: 10element at index 1: 20element at index 2: 30element at index 3: 40element at index 4: 50 加強的for迴圈12345678910 for(int i: numbers){ System.out.println(i); } Output: 1020304050 正如你看到的,加強的for迴圈不需要檢查陣列索引,如果你想逐個地訪問所有的元素這是一種很好的方法,但是同時因為你不能訪問索引,你就不能修改陣列元素。10)Java中陣列可以輕易的轉換成ArrayList。ArrayList一個基於索引的集合,它是作為陣列的備選方案。ArrayList的優點是可以改變容量大小,只需要建立個更大的陣列然後拷貝內容到新陣列,但你不能改變陣列的大小。11)Java API同樣提供了一些便捷方法通過java.utils.Arrays類去運算元組,通過使用Arrays你可以排序陣列,你可以做二分搜尋。12)java.lang.System類提供了實用方法拷貝元素到另一個陣列。在拷貝內容從一個陣列到另一個陣列的時候System.arrayCopy非常強大和靈活。你可以拷貝整個或子陣列,具體看你的需求。System.arraycoy語法:1 public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 如你所見,arraycopy允許我們指定索引和長度,能很靈活給你拷貝子陣列和儲存到需要的位置或目標陣列。這裡是一個例子,拷貝前三個元素到目標陣列:1234567891011121314151617181920212223242526272829 public static void main(String args[]) { int[] source = new int[]{10, 20, 30, 40, 50}; int[] target = new int[5]; System.out.println("Before copying"); for(int i: target){ System.out.println(i); } System.arraycopy(source, 0, target, 0, 3); System.out.println("after copying"); for(int i: target){ System.out.println(i); } } Output: Before copying 00000after copying 10203000 你可以看到拷貝之前所有元素是0,之後前三個元素被替換了。13)Java同樣支援多維陣列,在表示2D和3D的時候非常有用,像行和列或矩陣。多維陣列也是一個陣列的陣列,這裡是建立多維陣列的例子:1 int[][] multiArray = new int[2][3]; 這是陣列有2行3列,或者說長度是2的陣列中,它的每個元素裡儲存的是長度為3的陣列,這裡是初始化多維陣列的例子:123 int[][] multiArray = {{1,2,3},{10,20,30}}; System.out.println(multiArray[0].length); System.out.println(multiArray[1].length); 1 1 14)陣列是一種非常快的資料結構,如果你已經知道元素的長度,那麼就應該使用陣列而非ArrayList等資料結構。以上就是所有關於陣列的話題,如你所見,陣列是一種非常強大的資料結構。

相關文章