六、JavaSE語言基礎之陣列
一維陣列(關鍵字[])
關於陣列的一些概念:
陣列是多個基本資料有機組合形成一個複雜資料,是一個引用資料型別資料。
陣列:裝指定數量元素型別相同的資料的容器。
元素:在陣列中,陣列中的每個資料稱之為陣列的元素。
陣列的定義
建立陣列前必須先明確兩點:元素型別與元素個數
建立陣列物件共有三種格式
格式1:元素型別[] 陣列名 = new 元素型別[元素個數];
格式2:元素型別[] 陣列名 = new 元素型別[]{值1,值2,值3...};
格式3:元素型別[] 陣列名 = {值1,值2,值3...};
格式3是格式2的簡寫,編譯器會自動補齊
一條建立陣列物件語句做了哪些事?
int[] arr = new int[10]; //左邊 -> int []arr:定義一個要指向int陣列的陣列名arr; //右邊 -> new int[10]:建立一個裝10個int元素的陣列物件; //中間 -> 讓左邊的陣列名arr指向右邊的陣列物件;
關於陣列應該注意的幾點:
1、陣列名存放的是所建立陣列物件的地址;
2、關鍵字new每被呼叫一次就會建立一個新的物件(新的陣列);
3、使用print語句列印引用資料型別的名字,所得結果是物件型別@物件的16進位制記憶體地址;(字元陣列除外,列印字元陣列,列印的是元素組成的字串)如:[I@7852e922;[:陣列關鍵字、I:資料型別int、@之後:地址
4、陣列中的元素如果沒有賦值,編譯器會賦予一個預設初始值,預設初始值是什麼,取決於元素的型別。
5、獲取陣列元素的所有個數:物件名.length
使用陣列好處:
1、陣列會給其中的元素自動分配編號(索引、下標)編號0開始。
2、可以通過陣列名加編號的方式為其賦值和獲取該元素中存放的資料的值。
格式:陣列名[元素下標];
陣列元素的賦值格式:
陣列名[陣列下標]=符合該陣列資料型別的資料;
在學習完陣列之後,我們可能會遇到的第一個異常(編譯器不會自動報錯):
ArrayIndexOutOfBoundsException//陣列下標越界異常
陣列的遍歷及求最大值
陣列的遍歷主要有兩種方式:
方式1:使用for迴圈;
方式2:使用foreach語句;
求陣列的最大值的思路如下:
1、假定陣列第一位元素為最大值(max=array[0])
2、從陣列的第二位元素開始向後遍歷,依次與假定最大值max進行比較;如果大於max,則將max重新賦值;
陣列的排序
在學習陣列的排序之前,我們先學習如何交換兩個變數的值,通常使用的方法有兩種:
1、引入第三變數;
int a=3;
int b=8;
int c=a;//a=3 b=8 c=3
a=b;//a=8 b=8 c=3
b=c;//a=8 b=3 c=3
2、求和法;
int a=3;
int b=8;
a=a+b;//a=11 b=8
b=a-b;//a=11 b=3
a=a-b;//a=8 b=3
順序排序
思想:依次拿當前元素和其後面的所有元素做比較。
int[] array = {1, 3, 5, 7, 9, 0, 8, 6, 4, 2};
int temporary;
for (int i = 0; i < array.length - 1; i++) {
for (int j = i+1; j < array.length; j++) {
if (array[i] > array[j]) {
temporary = array[i];
array[i] = array[j];
array[j] = temporary;
}
}
}
/*
關於順序排序雙層for迴圈的取值範圍的兩個問題:
1、為什麼外層for迴圈的取值範圍是i<array.length-1;
因為順序排序的比較輪數是array.length-1;外層for初始值為0,所以外層for迴圈的取值範圍是i<array.length-1;
2、為什麼內層for迴圈的取值範圍是j<array.length;
順序排序的規則是依次拿當前元素和其後面的所有元素做比較;陣列中的最後一個元素下標是array.length-1,j取值j<array.length;剛好在這個範圍之中;
*/
氣泡排序
思想:依次拿相鄰元素做比較
int[] array = {1, 3, 5, 7, 9, 0, 8, 6, 4, 2};
int temporary;
for(int round=0;round<array.length;round++){
for(int index=0;index<array.length-i-1;index++){
if(array[index]<array[index+1]){
temporary=array[index];
array[index]=array[index+1];
array[index+1]=temporary;
}
}
}
/*
關於氣泡排序雙層for迴圈的取值範圍的兩個小問題:
1、為什麼外層for迴圈的取值範圍是i<array.length-1;
因為順序排序的比較輪數是array.length-1;for初始值為0,所以外層for迴圈的取值範圍是array.length-1;
2、為什麼內層for迴圈的取值範圍是j<array.length-i-1;
氣泡排序的規則是依次拿相鄰元素做比較,最值會逐漸向後移動,直至陣列末尾;也就是說經n輪排序後,陣列末尾是一個有序元素組合,故末尾無需繼續進行比較,也就是說每次的比較次數是遞減的,故-i,以使內層迴圈次數遞減;
*/
關於順序排序與氣泡排序的小結:
順序排序與氣泡排序的語法結構極為相似,但需要注意一點,順序排序與氣泡排序的外層for迴圈雖然取值範圍一樣,但代表的含義卻完全不同。順序排序的外層for循壞不僅代表了需要進行比較的輪數,同時也代表了需要與後續元素進行比較的元素的下標,而氣泡排序的外層for迴圈則僅代表比較的總輪數;
插入排序排序
**思想: **
將整個陣列array分為有序和無序的兩個部分,前者在左邊,後者在右邊;
開始有序的部分只有array[0] , 其餘都屬於無序的部分,每次取出無序部分的第一個(最左邊)元素,把它加入有序部分。
假設插入合適的位置p,則原p位置及其後面的有序部分元素都向右移動一個位置,有序的部分即增加了一個元素。
一直做下去,直到無序的部分沒有元素;
int[] array = {3, 1, 4, 6, 5, 9, 8, 7};
for(int indexLow = 1; indexLow < array.length; indexLow++) {
int interem = array[indexLow];
int indexHigh = indexLow - 1;
for(;indexHigh >=0; indexHigh --) {
if(array[indexHigh]>interem) {
array[indexHigh +1]=array[indexHigh];
}else {
break;
}
}
array[indexHigh +1]=interem;
}
二維陣列
n維陣列:裝指定數量相同型別的n-1維陣列的容器,n維陣列的元素是n-1維陣列
二維陣列關鍵字:[] []
建立二維陣列的三種格式:
格式1:元素型別[][] 陣列名 = new 元素型別[一維陣列的個數][一維陣列中元素的個數];
格式2:元素型別[][] 陣列名 = new 元素型別[][]{{值1,值2..},{值1,值2..},{值1,值2..}};
格式3:元素型別[][] 陣列名 = {{值1,值2..},{值1,值2..},{值1,值2..}};
int [][]arr = new int[3][4];
//arr:二維陣列的名字、new int[3][4]:二維陣列物件
//3:二維陣列中有3個一維陣列、4:每個一維陣列中有4個元素
System.out.println(arr);//[[I@7852e922,二維陣列地址
System.out.println(arr.length);//arr.length:二維陣列中一維陣列的個數
System.out.println(arr[0]);//[I@4e25154farr[i]:二維陣列中下標為i的一維陣列物件
System.out.println(arr[0].length);//arr[i].length:二維陣列中下標為i的一維陣列中的元素個數
System.out.println(arr[0][1]);//arr[i][j]:二維陣列中下標為i的一維陣列中下標為j的元素
遍歷二維陣列的方式:使用雙層迴圈;