java數組

數組不管在哪一種編程語言中都算是最重要的數據結構之一,同時不一樣語言的實現及處理也不盡相同。但凡寫過一些程序的人都知道數組的價值及理解數組的重要性,與鏈表一道,數組成爲了基本的數據結構。儘管Java提供了很棒的集合API和集合類如:ArrayList、HashMap,他們內部都是基於數組。若是你是來自於基於c或c++背景的程序員,那麼你會發現一些關於數組的行爲和如何在Java工做中的異同。最值得注意的是C中的數組與Java中的數組的邊界檢查,c編譯器不檢查若是程序訪問無效的數組索引,而java若是程序嘗試訪問無效的數組索引的話jvm會拋出ArrayIndexOutOfBoundException。在這篇文章中,咱們看看Java中的數組,包括原生類型和對象類型的數組,下面就介紹些有關Java數組及屬性的知識點。html

Java數組101java

(譯註:101指介紹某件事,讀者不須要任何預備知識)c++

1)數組在Java中是一個對象,數組實例一樣是使用new操做符建立的。Array.length指定了數組長度,例如:程序員

1
2
3
4
int [] intArray = new int [ 10 ];
System.out.println(intArray.length)
 
Output: 10

 

Array.length 表示數組的容量,只要數組建立了,每個索引被初始化爲默認值。編程

2)數組索引發始爲0,負數索引在Java中是無效的,會拋出ArrayIndexOutOfBoundException ,若是你嘗試用無效的索引訪問數組,這個無效的索引多是一個負索引,或者是大於等於數組長度的索引。數組

3)數組存儲在Java堆的連續內存空間,因此若是你建立一個大的索引,你能夠有足夠的堆空間直到拋出OutofmemoryError,由於請求的內存大小在連續的內存空間不可用。數據結構

4)數組一個固定長度 的數據結構,一旦聲明,你不能改變數組的長度。jvm

5)不一樣類型的數組有不一樣的類型,例以下面例子,intArray.getClass()不一樣於floatArray.getClass()編程語言

1
2
int [] intArray = new int [ 10 ];
float [] floatArray = new float [ 10 ];
1
6 )你不能存儲 double 值在 int 數組中,不然致使編譯錯誤。
1
2
int [] intArray = new int [ 10 ];
intArray[ 5 ]= 1.2 ; //compilation error

若是嘗試在運行時作這個操做,那麼Java拋出ArrayStoreExceptionspa

7)在Java數組中能夠有不一樣方式的建立方式,這裏就是建立數組的例子:

1
2
3
4
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,這裏是一個迭代的例子:

傳統的方式:

1
2
3
4
5
6
7
8
9
10
11
12
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 : 10
element at index 1 : 20
element at index 2 : 30
element at index 3 : 40
element at index 4 : 50

 

增強的for循環

1
2
3
4
5
6
7
8
9
10
for ( int i: numbers){
    System.out.println(i);
}
 
Output:
10
20
30
40
50

正如你看到的,增強的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容許咱們指定索引和長度,能很靈活給你拷貝子數組和存儲到須要的位置或目標數組。這裏是一個例子,拷貝前三個元素到目標數組:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
0
0
0
0
0
after copying
10
20
30
0
0

你能夠看到拷貝以前全部元素是0,以後前三個元素被替換了。

13)Java一樣支持多維數組,在表示2D和3D的時候很是有用,像行和列或矩陣。多維數組也是一個數組的數組,這裏是建立多維數組的例子:

1
int [][] multiArray = new int [ 2 ][ 3 ];

這是數組有2行3列,或者說長度是2的數組中,它的每一個元素裏保存的是長度爲3的數組,這裏是初始化多維數組的例子:

1
2
3
int [][] multiArray = {{ 1 , 2 , 3 },{ 10 , 20 , 30 }};
System.out.println(multiArray[ 0 ].length);
System.out.println(multiArray[ 1 ].length);
1
 
1
 

14)數組是一種很是快的數據結構,若是你已經知道元素的長度,那麼就應該使用數組而非ArrayList等數據結構。

以上就是全部關於數組的話題,如你所見,數組是一種很是強大的數據結構。

原文連接: javarevisited 翻譯: ImportNew.com - 劉志軍
譯文連接: http://www.importnew.com/7127.html
[ 轉載請保留原文出處、譯者和譯文連接。]

相關文章
相關標籤/搜索