數組
數組代表一系列對象或者基本數據類型,所有相同的類型都封裝到一起——采用一個統一的標識符名稱。簡單來講,數組就是一組相關數據的集合,是一連串的變量。Java中數組的定義和使用時通過方括號索引運算符進行的({}),一般來說,有兩種定義數組的方法,只需在類型名或標識符后跟一對方括號即可。
int[] a1;
int a1[];
兩種表示方法是完全一樣的。此時只是聲明了指向數組的一個對象,並未對其分配任何空間,為了創建數組相應的存儲空間,就必須要寫一個初始化表達式。如:
int b = {1, 2, 3, 4};
這是一種特殊的初始化表達式,必需在創建數組的地方出現,這種情況下會進行存儲空間的分配(等價於使用new)。
1 public class demo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 int a[] = new int[3]; 9 for(int i = 0; i<a.length;i++){ 10 System.out.println("a[" + i + "] = "+a[i]); 11 } 12 } 13 14 }
另一種分配存儲空間的方式是指出數組的長度,這樣做可以不必為數組的每一項賦值,因為此數組實際上已經指定了其內存空間大小,也就是不會報空指針異常,但必須注意,它會有默認值。
a[0] = 0 a[1] = 0 a[2] = 0
那么問題來了,為什么需要定義一個沒有數組的數組標識符呢。
int a2[];
實際上在Java中,可以將一個數組分配給另一個,所以能引用下述語句:
a2 = a1;
這樣會造成一些有趣的現象,讓我們做一個測試:
1 public class demo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 // TODO Auto-generated method stub 8 int a[] = new int[3]; // 實例化數組a 9 // 為數組a賦值 10 for (int i = 0; i < a.length; i++) { 11 a[i] = i; 12 System.out.println("a[" + i + "] = " + a[i]); 13 } 14 15 System.out.println("********我是分隔符**********"); 16 17 int b[]; // 聲明數組b 18 b = a; // 將數組a分配給數組b 19 // 輸出數組b 20 for (int i = 0; i < b.length; i++) { 21 22 System.out.println("b[" + i + "] = " + b[i]); 23 } 24 System.out.println("********我是分隔符**********"); 25 b[2] = 10; // 修改數組b中b[2]的值 26 System.out.println("b[2] = " + b[2]); // 輸出b[2] 27 System.out.println("a[2] = " + a[2]); // 輸出a[2] 28 29 } 30 31 }
運行結果:
a[0] = 0 a[1] = 1 a[2] = 2 ********我是分隔符********** b[0] = 0 b[1] = 1 b[2] = 2 ********我是分隔符********** b[2] = 10 a[2] = 10
可以看到,在將a分配給b后,實際上也將實際存儲空間內的數組使用權交給了b,所以修改了數組b中b[2]的值同時也會修改數組a中a[2]的值。
數組列表
實際上,無論是靜態初始化一個數組還是動態初始化一個數組,在創建的時候就會確定好其大小(或是說長度)。那么如果想動態的添加一個數組中的項,應該如何做呢。對於這個問題,我們就需要數組列表來幫我們解決了。
那么什么是數組列表。
實際上,無論是數組還是數組列表本質上都是一個類,那么定義一個類,就需要定義這個類的屬性和方法。那么一個數組列表會有哪些屬性方法呢。
1.屬性
基於數組列表的功能訴求,我們需要兩個屬性,一個是大小,另一個是數組。因此我們需 要定義一個變臉來記錄元素的個數,還要定義一個數組來存儲元素。所以屬性就包括:
private int count; // 保存數組的長度 private int data[]; //創建一個數組
2.方法
完成了以上,我們便需要一些方法,對於數組列表,一些基本的方法包括存放元素、獲取元素個數、取出元素、修改元素和刪除元素。
以創建一個int類型的數組列表為例完整代碼如下:
1 /** 2 * 3 * @author 陸放為 4 * 接口類 5 */ 6 public interface C { 7 8 9 /** 10 * 添加一個元素 11 */ 12 public void store(int element); 13 14 /** 15 * 獲取數組長度 16 */ 17 public int getCount(); 18 19 /** 20 * 修改元素 21 */ 22 public void upData(int index, int newElement); 23 24 /** 25 * 取出元素 26 */ 27 public int getElement(int index); 28 29 /** 30 * 刪除元素 31 */ 32 public void delete(int index); 33 }
1 public class D implements C { 2 3 private int count; // 保存數組的長度 4 private int data[]; //創建一個數組 5 6 @Override 7 public void store(int element) { 8 // TODO Auto-generated method stub 9 10 // 創建一個臨時數組 11 int[] temp = new int[count + 1]; 12 13 // 將原數組內容復制到臨時數組中 14 for (int i = 0; i < count; i++) { 15 16 temp[i] = data[i]; 17 18 } 19 20 data = temp; 21 22 //添加新的元素 23 data[count] = element; 24 25 //讓數組長度加一 26 count++; 27 28 } 29 30 @Override 31 public int getCount() { 32 // TODO Auto-generated method stub 33 return count; 34 } 35 36 @Override 37 public void upData(int index, int newElement) { 38 // TODO Auto-generated method stub 39 data[index] = newElement; 40 41 } 42 43 @Override 44 public int getElement(int index) { 45 // TODO Auto-generated method stub 46 return data[index]; 47 } 48 49 @Override 50 public void delete(int index) { 51 // TODO Auto-generated method stub 52 53 //創建一個臨時數組 54 int temp[] = new int[count-1]; 55 56 //將刪除項前的元素復制到臨時數組中 57 for(int i = 0; i < index-1; i++){ 58 temp[i] = data[i]; 59 } 60 61 //將刪除項后的元素復制到臨時數組中 62 for(int i = index-1; i < count-1; i++){ 63 temp[i] = data[i+1]; 64 } 65 66 data = temp; 67 68 //數組長度減一 69 count--; 70 } 71 72 }
測試結果如下:
1 public class Demo { 2 public static void main(String[] args) { 3 System.out.println("實例化一個數組列表d"); 4 D d = new D(); 5 System.out.println("*******添加項************"); 6 for (int i = 0; i < 5; i++) { 7 d.store(i); 8 System.out.println("d的第" + i + "項為:" + d.getElement(i)); 9 } 10 System.out.println("數組長度為" + d.getCount()); 11 System.out.println("**********刪除項***************"); 12 d.delete(2); 13 for (int i = 0; i < d.getCount(); i++) { 14 System.out.println("d的第" + i + "項為:" + d.getElement(i)); 15 } 16 System.out.println("數組長度為" + d.getCount()); 17 System.out.println("***********更新項*************"); 18 d.upData(3, 15); 19 for (int i = 0; i < d.getCount(); i++) { 20 System.out.println("d的第" + i + "項為:" + d.getElement(i)); 21 } 22 System.out.println("數組長度為" + d.getCount()); 23 } 24 25 }
輸出結果:
實例化一個數組列表d *******添加項************ d的第0項為:0 d的第1項為:1 d的第2項為:2 d的第3項為:3 d的第4項為:4 數組長度為5 **********刪除項*************** d的第0項為:0 d的第1項為:2 d的第2項為:3 d的第3項為:4 數組長度為4 ***********更新項************* d的第0項為:0 d的第1項為:2 d的第2項為:3 d的第3項為:15 數組長度為4
多維數組
關於多維數組,以二維數組為例,類似於一個二維矩陣,但實際上是也是如同一維數組一樣進行鏈式存儲,邏輯理解上可參考for循環的多重嵌套。