1 數組也是一種類型 Java中要求所有的數組元素具有相同的數據類型。因此在一個數組中,數組元素的類型是唯一的,不能存儲多種類型的數據。 一旦數組的初始化完成,數組在記憶體中所占的空間將被固定下來,因此數組的長度不可以被改變。即使某個數組元素的數據被清空,他占的空間依然被保留,依然屬於該數組,數組的長 ...
1 數組也是一種類型
- Java中要求所有的數組元素具有相同的數據類型。因此在一個數組中,數組元素的類型是唯一的,不能存儲多種類型的數據。
- 一旦數組的初始化完成,數組在記憶體中所占的空間將被固定下來,因此數組的長度不可以被改變。即使某個數組元素的數據被清空,他占的空間依然被保留,依然屬於該數組,數組的長度依然不變。
- Java的數組既可以存儲基本類型的數據,也可以存儲引用類型的數據,只要所有的數組元素具備相同的類型即可。
- 值得指出的是,數組也是一種數據類型,是引用類型。所以可以把數組作為數組的元素,也就構成了二維數組
2 定義一個數組
數組的定義可以採用兩種方法,推薦採用第一種,這樣變數的類型是數組這一概念更加直接。
(1) type[] arrayName; (2) type arrayName[];
數組是一個引用類型的變數,因此使用它定義一個變數時,僅僅表示定義了一個引用變數(也就是定義了一個指針),這個引用變數還未指向任何有效的記憶體,因此定義數組時並沒有指定數組的長度,這個應用變數並沒有指向任何有效的記憶體空間,所以還不能被使用,需要對其初始化。
3 初始化數組
註意,不要在進行初始化時,既指定數組的長度也為每個數組元素分配初始值。 一般採用下列方法中的一種。
3.1 靜態初始化
初始化時由程式員顯示指定每個數組元素的初始值,由系統決定數組長度。
arrayName = new type[] {element1 , element2 , element3 , element4...};
- 此處的type必須與定義數組變數時所用的type相同,也可以是定義時的type的子類
- 執行靜態初始化時,顯示指定的數組元素值的類型必須與new關鍵字後面的type類型相同,或者時其子類的實例。
3.2 動態初始化
初始化時程式員只指定數組長度,由系統為數組元素分配初始值。
arrayName = new type[length];
3.3 更簡潔的方法
如果我們在定義的時候就對數組進行靜態初始化,可以用一種更簡潔的方法。
type[] arrayName = {element1 , element2 , ...};
4 遍曆數組
Java為數組提供了一個更簡單的迴圈,foreach迴圈。這種迴圈會自動遍曆數組和集合,更加簡潔。使用foreach時無需獲得數組和集合的長度,無需根據指引訪問數組元素和集合元素。語法:
for(type variableName : array |collection){ //variableName 自動迭代訪問每個元素 }
variableName 是一個形參名,foreach 會自動將數組元素依次賦給該變數。冒號後面寫數組名或集合名
foreach 方法不能修改原數組的值,只能讀取,因為我們在語句裡面直接訪問的是形參,而不是數組本身,foreach 會自動將數組的值賦給形參供我們提取。
5 深入數組(記憶體)
在這裡我們假設定義的是 int[] 類型。
- 在我們定義一個數組變數的時候,系統會在棧記憶體存放一個變數,這個變數的類型是引用類型,這個變數的值為 null ,並不指向任何有效的記憶體空間。
- 接著我們用 new 關鍵字為其創建了一個 int[] 類型的對象,這個對象存放在系統的堆記憶體中,在用“=”將其賦給變數的時候,實際上是將堆記憶體里對象的地址賦給了變數,這時候就可以通過”arrayName[index]“的方式訪問數組的值。這裡假設數組長度是5。
- 假設我們再創建一個數組變數 array2,並將 arrayName 賦給它,這時候 array2 接受到的實際是 arrayName 變數存儲的地址,所以這兩個變數將指向同一個數組。若我們把 1 賦給array2[0],這時候我們列印 arrayName[0] 的時候會發現,它的值也是1,這是因為它們指向的是同一個記憶體中存儲的值。
6 數組常用方法
6.1 插入演算法
一個數組有序,添加一個元素後,數組依然有序。
public class AddNumToArray{ public static void main(String[] args){ // 一個有序的數組,向該數組中添加一個元素,數組依然有序。 int[] arr = {1,3,7,9,12,20,0}; int t = 0; // 【1】找位置 int loc = -1; // 表示t應該添加到的位置 for(int i = 0;i<arr.length-1;i++){ if(arr[i] >= t){ loc = i; break; } } System.out.println("loc = "+loc); if(loc < 0){ // 沒找到合適的位置 arr[arr.length-1] = t; }else{ // 【2】依次後移 for(int j=arr.length-1;j>loc;j--){ arr[j] = arr[j-1]; } // 【3】添加插入的值 arr[loc] = t; } // 驗證 for(int i = 0;i<arr.length;i++){ System.out.print(arr[i]+"\t"); } } }
6.2 刪除演算法
從數組中刪除一個數據,繼續保持有序排列
public class DeleteNumFromArray{ public static void main(String[] args){ // 刪除演算法 int[] arr = {1,3,7,9,12,20}; int t = 1; // 【1】找位置 int loc = -1; for(int i=0;i<arr.length;i++){ if(t == arr[i]){ loc = i; break; } } // 【2】移動元素 if(loc < 0){ System.out.println(t+"在數組中不存在"); }else{ for(int j = loc;j<arr.length-1;j++){ arr[j] = arr[j+1]; } // 【3】最後一個元素置0 arr[arr.length-1] = 0; } // 驗證 for(int i = 0;i<arr.length;i++){ System.out.print(arr[i]+"\t"); } } }
6.3 冒泡排序法
將無序數組按順序排列
public class Test10{ public static void main(String[] args){ // 對一個無序的數組進行排序 int[] arr = {10,5,3,4,2,9,7}; int tmp = 0; for(int i=0;i<arr.length-1;i++){ // 外層控制趟數 for(int j=0;j<arr.length-1-i;j++){ // 兩兩比較 if(arr[j]>arr[j+1]){ tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp; } } } for(int i=0;i<arr.length;i++){ System.out.print(arr[i]+"\t"); } } }