#類別、介面、陣列、String |
null |
|
4.總結
陣列適合同種類型的大量資料
靜態初始化適合知道了元素值
動態初始化適合不清楚存入哪些資料
三、陣列的屬性
1.訪問
##一般訪問陣列的方式為:
陣列名稱[索引]
#範例://静态初始化数组
int [] array= {1,2,3,4,5};
System.out.println(array[0]);//输出 1
System.out.println(array[1]);//输出 2
System.out.println(array[3]);//输出 4
2.長度長度可以直接呼叫length得到數組的長度。 例題://静态初始化数组
int [] array= {1,2,3,4,5};
System.out.println(array.length);//调用方法,输出长度 5
//最大索引array.length-1
3.遍歷遍歷就是一個陣列元素的訪問,主要應用在搜尋、資料統計......我們之前學了循環結構、分支結構,下面透過for迴圈遍歷一個陣列例題:給定元素{10,8,9,4,5,6,8 ,71,2,3,9,99},用靜態陣列儲存並輸出數組中大於5的元素? 編碼實作://静态初始化数组
int [] array= {10,8,9,4,5,6,8,71,2,3,9,99};
for(int i=0;i<array.length;i++)
{
if(array[i]>5)
System.out.println(array[i]);
}
輸出結果:
10 8 9 6 8 71 9 99
#四、記憶體圖

- Java在程式運行時,需要在記憶體中分配空間,並對空間進行了不同區域的劃分。
- 堆疊記憶體:儲存局部變量,使用完畢立即消失
- 堆疊記憶體:儲存new 出來的內容(物件、實體),位址使用完畢在垃圾回收器空閒時回收
1.單數組記憶體圖下面的建立陣列程式碼,實現它的記憶體關係圖編碼實作://动态初始化数组
int [] arr=new int[3];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//修改值
arr[0]=100;
arr[2]=200;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
輸出結果:
[I@15db97420
0
0
[I@15db9742
100
0
200
原理講解:

- #動態初始化先在堆記憶體產生一個new一個arr位址值,具體看編譯器的結果,這裡假設001。由於動態初始化,所以每個元素都有一個初始值,可以看上面的表。我們輸出元素,先存取陣列名稱位址,到堆記憶體下標,再輸出元素值。
- 修改陣列值,歷程和檢視相同,只不過多了一步修改的過程,如下圖:

2.多數組記憶體圖

多個陣列和單數組記憶體使用原理相同,這裡我就不過多講述了。 3.陣列指向相同記憶體假如我們把兩個陣列的位址值改為相同,修改後的結果該是如何,如下面的程式碼。 編碼實作://动态初始化数组
int [] arr=new int[3];
arr[0]=100;
arr[1]=200;
arr[2]=300;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
int [] arr2=arr;
arr2[0]=111;
arr2[1]=222;
arr2[2]=333;
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr2);
System.out.println(arr2[0]);
輸出結果:
[I@15db9742100
200
300
[I@ 15db9742
111
[I@15db9742
111
原理講解:

第一個陣列在堆記憶體的位址為001,第二個陣列也是001,所以修改第二個陣列的值,其實都是同一個陣列記憶體。第一個陣列的值也會隨著改變,結果如下:

五、常見問題1.索引越界//静态初始化数组
int [] array= {1,2,3};
System.out.println(array[3]);
- 上面的程式碼執行之後,會出現下面的報錯例外:
- Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
- 解釋:我們靜態化初始數組給了3個數字,最大索引為2,當我們訪問3時,就會報錯
2.空指針異常//动态初始化数组
int [] array= new int[3];
array=null;
System.out.println(array[0]);
- 上面的程式碼執行之後,會出現下面的報錯異常:
- Exception in thread "main" java.lang.NullPointerException
- 解釋:我們將陣列置為null,導致存取的陣列不指向堆記憶體的資料