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");
		}
	}
}

  


免責聲明!

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



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