數組,英文叫Array,是一種數據結構,是用來存放同一數據類型數值的集合。例如存放30個int型數值、存放100個double型數值等等。html
咱們知道使用一個變量,須要先聲明一個變量,例如:int a;使用數組一樣也須要先聲明一個數組變量。假設咱們要聲明一個int類型的數組變量,有2種方式:java
int[] a; int b[];
可是通常Java工做者都習慣於第一種方式,由於int[]看起來更像數據類型,後面跟一個變量名。算法
聲明變量,其實是在內存中給它分配一塊空間。可是數組是存放若干個數據,所以還得繼續聲明它的大小,即存放多少個數據。Java中使用new運算符來操做。像下面這樣:api
a = new int[30];
咱們還能夠在聲明數組的同時就分配空間:數組
int[] a = new int[30];
上面這條語句聲明int型的數組a能夠存放30個int的數值。這樣,就會在內存中分配30個連續的空間。瀏覽器
數組大小分配好了之後。咱們要訪問數組中的某一個元素的話,能夠用一個整型的下標(index)來訪問。下標是從0開始的,所以上面的數組a的下標是0~29。好比咱們要訪問第29個元素,那麼能夠用a[28]。這裏須要注意,數組一旦被建立了之後,大小就是固定的。若是下標超出範圍,例如訪問a[30],程序會報異常,異常通常是:「array index out of bounds」,稱作「下標越界」。數據結構
給數組的元素賦值就很簡單了,就像給一個普通變量賦值同樣:工具
a[22] = 22;
咱們還能夠在聲明數組的時候同時賦值,有兩種形式:優化
int[] a = new int[] { 1, 2, 3, 4 }; int[] b = { 1, 2, 3, 4 };
注意第一種形式,[]內不須要指定大小。有的時候,咱們還須要知道數組的大小,能夠用a.length來得到。例如咱們想遍歷打印數組的值:spa
for (int i = 0; i < a.length; i++) { System.out.println(a[i]); }
綜合上面的討論,咱們能夠概括一下數組的3要素:
訪問數組的元素用「變量名[下標]」的方式。下標的範圍是0~length。若是不在這個範圍內,程序會報「下標越界」異常。
用一張圖總結一下:
在實際運用中,常常會有遍歷數組的需求。上面咱們用for演示過遍歷數組的狀況。事實上,在Java5.0以後,有另一種for循環的結構,能夠很是方便的遍歷一個集合中的元素。代碼形式爲:
for(類型 變量:集合){語句}
咱們看一個例子:
int[] a = new int[] { 1, 2, 3, 4 }; for (int i : a) { System.out.println(i); }
運行結果:
1 2 3 4
這種for循環能夠理解爲「遍歷集合中的每個元素」。
在實際工做中,還會常常碰到須要將一個數組中的所有或部分元素拷貝到另外一個元素中的需求。若是是全量拷貝,有一個很簡單的辦法:
int[] a = new int[] { 1, 2, 3, 4 }; int[] b = a;
執行以上代碼後,數組b和數組a就同樣了。可是這樣有一個問題,咱們繼續編寫代碼:
int[] a = new int[] { 1, 2, 3, 4 }; int[] b = a; b[3] = 33;// 將數組的b的第4個元素賦值爲33 System.out.println(a[3]);// 結果數組a的第4個元素也變成33
咱們修改數組b的第4個元素,結果數組a的第4個元素也跟着一塊修改了。這是爲何呢?這是由於Java中變量的的賦值,是引用賦值,用內存的表現來解釋能夠一目瞭然:
把變量a賦值給變量b,實際上b和a將指向同一個內存地址。所以修改b的元素,實際上就是修改內存中的值,這樣a的元素天然也就跟着修改了。咱們稱這種拷貝爲「淺拷貝」。若是想要實現另外分配一塊內存空間給數組b,有沒有辦法呢?Java給咱們提供了2種方法,一種是用System類的arraycopy方法,還有一種是Java6以後新提供的Arrays類的copyOf方法。具體怎麼用?還記得安裝JDK的時候,提到過的API文檔嗎?咱們這時候就須要用到它了。(若是不記得了,回到那一節看一遍)。
筆者的API文檔的路徑是:D:\Java大失叔\Java\jdk-8u261-docs-all\docs,咱們找到api目錄下的index.html,用瀏覽器打開,能夠看到首頁:
左上是全部的包,左下是當前包下的類,右邊是當前類的API說明。未來咱們會常常用到API文檔來查找類的使用說明。咱們先來看一下System的arraycopy方法。
System類在java.lang包下,咱們定位到System類後,找到arraycopy方法,點擊方法名,能夠進入該方法的詳細說明。咱們摘抄方法體:
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
這個方法的做用就是從源數組src的srcPos下標開始,拷貝length個元素到目標數組dest中,目標數組的起始下標爲destPos。咱們直接上代碼:
int[] a = new int[] { 1, 2, 3, 4 }; int[] b = new int[4]; System.arraycopy(a, 0, b, 0, 4); b[3] = 33;// 將數組的b的第4個元素賦值爲33 System.out.println(b[3]);// 數組b的第4個元素變成33 System.out.println(a[3]);// 數組a的第4個元素仍然是4
接下來,咱們看一下Arrays.copyOf方法,Arrays類在java.util包下,util包提供了不少有用的工具類,Arrays是其中之一,咱們會發現有不少copyOf方法,咱們找到對應int型的:
copyOf(int[] original, int newLength)
這個方法的做用就是將源數組original的全部元素拷貝到一個新的數組中,能夠指定新的數組的大小newLength,而後返回新的數組。若是newLength比源數組大小大,那麼新數組多餘的元素將被賦值爲0,若是newLength比源數組大小小,那麼將只拷貝newLength個元素。咱們上代碼:
int[] a = new int[] { 1, 2, 3, 4 }; int[] b = Arrays.copyOf(a, 5); int[] c = Arrays.copyOf(a, 3); b[0] = 33;// 將數組的b的第4個元素賦值爲33 c[0] = 44;// 將數組的b的第4個元素賦值爲33 System.out.println(a[0]);// 數組a的第1個元素仍然是4 System.out.println(b[0]);// 數組b的第1個元素變成33 System.out.println(c[0]);// 數組c的第1個元素變成44
數組的排序也能夠用Arrays類的sort方法,咱們摘抄方法:
sort(int[] a)
這個方法對數組a進行升序排序。它內部採用的是優化的快速排序算法,這個算法對於大多數的數據集合來講效率都比較高。咱們看一下代碼:
int[] a = new int[] { 1, 4, 2, 3 }; Arrays.sort(a); for (int i : a) { System.out.println(i); }
運行結果:
1 2 3 4
排序以後,按照升序排列了。
Arrays類還有不少有用的方法,這裏就不一一列舉了,你們之後若是碰到須要對數組進行某些操做的時候,能夠想到來查一下Arrays類,看看有沒有對應的方法。
Java中還支持多維數組,可是其實在實際運用中不多用到,最多也就用一下二維數組,所以這裏只粗略的介紹一下二維數組。咱們常常用到Excel表格,其實就能夠當作一個二維數組,例如:
11 |
12 |
13 |
14 |
21 |
22 |
23 |
24 |
31 |
32 |
33 |
34 |
41 |
42 |
43 |
44 |
51 |
52 |
53 |
54 |
聲明二維數組、分配空間和賦值訪問和一維數組相似,咱們用代碼演示:
int[][] table;// 聲明一個二維數組 table = new int[5][4];// 分配空間5行4列 table[0][1] = 12;// 第1行第2列賦值爲12
對於賦值,也能夠和一維數組同樣,在聲明的同時就賦值:
int[][] table = new int[][] { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };// 聲明一個二維數組,並賦值 int[][] table2 = { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };// 聲明一個二維數組,並賦值
二維數組其實能夠當作是一個一維數組,而後該維度數組的每個元素又是一個一維數組。用圖能夠表示以下:
所以,聰明的你可能發現了,Java的二維數組中,數組的length的值是第一維度的大小。而且咱們在分配二維數組大小的時候,能夠只分配第一維度的大小,而後再給第一維度的數組的每個元素分配不一樣的大小,例如:
int[][] table = new int[4][];// 只分配第一位維度的大小爲4 table[0] = new int[1];// 給table[0]分配大小爲1 table[0][0] = 11; table[1] = new int[] { 21, 22 };// 給table[1]分配大小爲2,同時賦值 table[2] = new int[] { 31, 32, 33 };// 給table[2]分配大小爲3,同時賦值 table[3] = new int[] { 41, 42, 43, 44 };// 給table[3]分配大小爲4,同時賦值
這實際上是一個不規則的二維數組。用表格表示以下圖:
11 |
|
|
|
21 |
22 |
|
|
31 |
32 |
33 |
|
41 |
42 |
43 |
44 |