數組與數組列表


數組

  數組代表一系列對象或者基本數據類型,所有相同的類型都封裝到一起——采用一個統一的標識符名稱。簡單來講,數組就是一組相關數據的集合,是一連串的變量。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循環的多重嵌套。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM