數組
舉例:假如現在有十個人排成一隊【張三,李四,王五……】,這個隊的隊名叫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列