智漁課堂官方免費教程二十六:Java基礎教程之數組

數組

舉例:假如現在有十個人排成一隊【張三,李四,王五……】,這個隊的隊名叫A,然後要求第一個人從0開始報數【張三報0,李四報1,王五報2……】。現在要求第一個人出列,但現在還不知道張三的名字,怎麼辦?那麼只能要求A隊0號出列。請問此時誰會出列?很明顯是張三出列。
這對人就形成了類似數組的結構;其中隊名A就對應數組名,各個人報的號就對應數組的下標,而每個人就對應數組中的元素,人的個數就對應數組的長度。
在程序設計中,把具有相同類型的若干個變量按有序的形式組合在一起,僅使用一個變量名來存儲這些元素,用下標(下標從0開始)來對應不同位置的變量,這就是數組。


創建數組

聲明語法格式: 
方式一、數據類型[] 變量名 = { 數據1, 數據2, ....數據n };
方式二、數據類型[] 變量名 = new 數據類型[]{ 數據1, 數據2, ....數據n };
方式三、數據類型[] 變量名 = new 數據類型[長度值]; 
賦值語法格式:
變量名[下標] = 值;


實例:
/*
執行完此句代碼後,內存中存在一個名字叫i的變量,並且佔用3個int類型長度的連續空間(即佔用連續12字節的內存空間),並按每個int類型長度(4字節)爲單位自左向右進行編號,編號從0開始。然後將int類型的值1存入編號爲0的4個字節中,2存入編號爲1的4個字節中,3存入編號爲2的4個字節中。並將這12字節內存空間的起始地址複製給變量i
其中int是數據類型,[]中括號代表數組,變量名i也可稱爲數組名,{}大括號表示數組常量(其內部包含數組元素),其中的數據1,2,3是數組的三個(長度爲3)元素(多個元素之間用英文格式的逗號隔開),對應的編號0、1、2是數組的下標。
*/
int[]  i = {1, 2, 3};
//創建一個長度爲5的String類型的數組;
//此處的new操作是在創建數組對象,所以後面跟的是中括號和長度:類型[長度] 
String[]  str = new  String[5]; 
//爲數組的元素賦值;其中str [0]中的0代表的是下標
str [0] = "abc";
//此處的new操作是創建String對象,所以後面跟小括號,而不是中括號;
//然後將創建的String對象賦值給數組中下標爲1的位置
str [1] = new  String("xyz");
//此句會出現錯誤,因爲數組的長度是5,下標是0到4
//此處使用5作爲下標,超出了數組下標的界限
str[5] = "aaa"


注意:
方式一隻能寫在一條語句中,不能拆成兩條語句;
例如:int  i;   i = {1, 2, 3};  //這樣是錯誤的。
方式二new 類型[]{};的中括號[]中不能寫長度值,大括號中元素的個數就是長度值
方式三new 類型[3];的中括號[]中必須寫長度值
另外:聲明數組變量時[]可以寫在數據類型後,也可以寫在變量名後,如:int  i[];


數組是引用類型,其引用可以指向任何相同類型的數組對象,但數組對象一旦創建,其長度無法再改變。而且數組對象佔用的內存空間一定是連續的。


操作數組

使用下標訪問數組中的數據
語法格式:數組名[下標]
獲取數組的長度:數組名.length;
實例:
package array;
/**
 * 操作數組類OperationArray
 * 實現向數組中添加數據
 * 訪問數組中的數據
 * 查詢數組中的數據
 * 修改數組中的數據
 * 向數組中插入數據
 * 刪除數組中的數據
 * @author 學霸聯盟 - 趙燦
 */
public class OperationArray {

	public static void main(String[] args) {
		//創建長度爲4的字符串數組,用於存儲學生姓名
		String[] studentNames = new String[4];
		//向數組中添加值;數組中的最後一個位置沒有添加值,引用類型默認值爲null
		studentNames[0] = "張三";
		studentNames[1] = "李四";
		studentNames[2] = "王五";
		System.out.println("----------- 初始數組中的值 -----------");
		//調用遍歷數組的方法
		ergodicArray(studentNames);
		System.out.println("----------- 查詢數據 -----------");
		//查詢“李四”在數組中的位置
		for (int i = 0; i < studentNames.length; i++) {
			//判斷兩個字符串的內容是否相同使用equals方法,而不能使用雙等號==
			//用字符串"李四"依次和數組中的字符串比較,如果相同equals方法返回true
			if ("李四".equals(studentNames[i])) {
				System.out.println("李四在數組studentNames中的下標爲:"+i);
				//如果已找到"李四",無需再繼續查找,用break結束循環
				break;
			}else if(i == studentNames.length - 1){
				//判斷i是否等於數組的最後一個下標
				//否則找不到"李四"時此代碼塊會被執行多次
				System.out.println("在數組studentNames中沒有找到李四");
			}
		}

		System.out.println("----------- 修改後的數據 -----------");
		//將下標爲2的“王五”修改爲“趙六”
		studentNames[2] = "趙六";
		//調用遍歷數組的方法,輸出修改後的數據
		ergodicArray(studentNames);
		
		System.out.println("----------- 插入後的數據 -----------");
		/*
		 * 向下標爲2的位置重新插入“王五”
		 * 既然是插入,從下標爲2到數組的結尾的每一個元素都要向後移動一位
		 * 然後將下標爲2的位置賦值爲“王五”
		 * 所以for循環要從數組中倒數第一個元素開始訪問,即studentNames.length-1
		 * 至等於2時結束,並且下標是一個一個不斷在減小的
		 */
		for (int i = studentNames.length - 1; i >= 2; i--) {
			//將前面一個位置的值,賦值給後面一個位置,以此實現每個元素的位置移動
			studentNames[i] = studentNames[i-1];
			if ( i == 2 ) {
				/*
				 * 當下標等於2時,要先將原來的值移動到3的位置上
				 * 再給下標爲2的位置上賦要插入的新值
				 * 所以賦新值的代碼應該在位移代碼的後面
				 */
				studentNames[2] = "王五";
			}
		}
		//調用遍歷數組的方法,輸出修改後的數據
		ergodicArray(studentNames);
		
		System.out.println("----------- 刪除後的數據 -----------");
		/*
		 * 將下標爲2的位置上的值刪除,即刪除剛剛插入的“王五”
		 * 刪除後應該回到插入“王五”之前的狀態
		 * 恰好和插入相反,刪除是將2位置以後的每個位置的元素往前移動一位
		 */
		for (int i = 2; i < studentNames.length; i++) {
			if ( i == studentNames.length - 1 ) {
				/*
				 * 當下標等於數組的最後一個位置時,其後已經沒有其他值了
				 * 所以不需要再執行移動操作,這裏將最後一個位置的值賦值爲null
				 */
				studentNames[i] = null;
			}else{
				//將後一位置上的值,賦值給前一個位置,從而實現元素的位置移動
				studentNames[i] = studentNames[i+1];
			}
		}
		//調用遍歷數組的方法,輸出修改後的數據
		ergodicArray(studentNames);
		
	}
	
	/**
	 * 遍歷數組的方法;遍歷:就是一個一個的訪問
	 * 其中參數爲需要遍歷的數組
	 * 由於多處需要用到遍歷輸出數組中的值,所以將其放到一個方法
	 * 這樣在需要使用的位置,調用這個方法就可以複用遍歷輸出的代碼了
	 */
	private static void ergodicArray(String[] array) {
		//循環輸出數組中的每一個值
		for (int i = 0; i < array.length; i++) {
			//使用下標訪問數組中的值和製表符
			System.out.print(array[i] + "\t");
		}
		//輸出換行符
		System.out.print("\n");
	}
}
運行結果:
----------- 初始數組中的值 -----------
張三	李四	王五	null	
----------- 查詢數據 -----------
李四所在數組studentNames中的下標爲:1
----------- 修改後的數據 -----------
張三	李四	趙六	null	
----------- 插入後的數據 -----------
張三	李四	王五	趙六	
----------- 刪除後的數據 -----------
張三	李四	趙六	null	

二維數組

就是一維數組中的每個元素也是一維數組,這樣組成的數組就是二維數組。
方式一、數據類型[][] 數組名 = {{ 值1,...值n},{值1,...值m},{值1,...值k}};
方式二、數據類型[][] 數組名;
數組名 = new 數據類型[][]{{....},{....}};

和一維數組一樣,方式一隻能寫在一條語句中,不能分成兩條語句編寫;

方式三、數據類型[][] 數組名 = new 數據類型[外層數組長度][內層數組長度];
數組名[0][0] = 值;

方式四、數據類型[][] 數組名 = new 數據類型[外層數組長度][];
數組名[下標] = new 數據類型[長度];

遍歷二維數組

實例:
package array;
/**
 * TwoDimensionalArrayDemo類:演示二維數組
 * @author 學霸聯盟 - 趙燦
 */
public class TwoDimensionalArrayDemo {
	public static void main(String[] args) {
		/*
		 * 聲明一個String類型的二維數組classroom
		 * 第一維的長度爲2,第二維的長度爲3
		 * 即一個長度爲2的一維數組,其每一個元素都是長度爲3的一維數組
		 */
		String[][] classroom = new String[2][3];
		classroom[0][0] = "第1行第1列";
		classroom[0][1] = "第1行第2列";
		classroom[0][2] = "第1行第3列";
		classroom[1][0] = "第2行第1列";
		classroom[1][1] = "第2行第2列";
		classroom[1][2] = "第2行第3列";
		//循環獲取第一維數組中的每個元素
		for (int i = 0; i < classroom.length; i++) {
			//其中的每個元素又是一個一維數組
			String[] row = classroom[i];
			/*
			 * 再次循環獲取到的一維數組
			 * 其中row.length 等價於 classroom[i].length
			 */
			for (int j = 0; j < row.length; j++) {
				/*
				 * 此時獲取到的是一個字符串值
				 * 其中row[j] 等價於 classroom[i][j]
				 */
				System.out.println(row[j]);
			}
		}
	}
}
運行結果:
第1行第1列
第1行第2列
第1行第3列
第2行第1列
第2行第2列
第2行第3列

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章