JAVA進階(02)陣列
阿新 • • 發佈:2018-11-28
一、概述
1、定義
- 陣列是相同型別資料的有序集合;
2、特點
- 長度是確定的;
- 元素必須是相同型別,可以是基本型別和引用型別;
3、本質
- 陣列是物件,每個元素可以看作是物件的屬性;
- 陣列無論存基本型別還是引用型別,陣列物件本身是在堆中儲存的;
二、陣列的建立和基本使用
1、建立
int[] a = { 1, 2, 3 };// 靜態初始化基本型別陣列; Man[] mans = { new Man(1, 1), new Man(2, 2) };// 靜態初始化引用型別陣列; int[] a1 = new int[2];//動態初始化陣列,先分配空間; a1[0]=1;//給陣列元素賦值; a1[1]=2;//給陣列元素賦值;
2、遍歷
- 普通 for 迴圈
- 增強 for 迴圈:不能修改元素;不能操作索引;
3、陣列拷貝
public class Test { public static void main(String args[]) { String[] s = {"阿里","京東","搜狐","網易"}; String[] sBak = new String[6]; System.arraycopy(s,0,sBak,0,s.length); for (int i = 0; i < sBak.length; i++) { System.out.print(sBak[i]+ "\t"); } } }
4、Arrays 工具類
(1)Arrays類包含:陣列的排序、查詢、填充、列印內容等常見的操作
(2)排序
- 基本型別:Arrays.sort();
- 引用型別:該引用型別要實現 Comparable 介面
class Man implements Comparable { int age; String name; public Man(int age, String name) { super(); this.age = age; this.name = name; } public String toString() { return this.name; } public int compareTo(Object o) { Man man = (Man) o; if (this.age < man.age) { return -1; } if (this.age > man.age) { return 1; } return 0; } }
(3)查詢:二分查詢
Arrays.sort(arr); //使用二分法查詢,必須先對陣列進行排序;
Arrays.binarySearch(arr, 12);
(4)填充:Arrays.fill(arr, 2, 4, 100) 將2到4索引的元素替換為100
(5)列印:Arrays.toString(arr)
三、多維陣列
1、二維陣列建立
int[][] a = { { 1, 2, 3 }, { 3, 4 }, { 3, 5, 6, 7 } };
int[][] a = new int[3][];
a[0] = new int[] { 1, 2 };
a[1] = new int[] { 2, 2 };
a[2] = new int[] { 2, 2, 3, 4 };
2、二維陣列長度:arr.length 和 arr[0].length
3、儲存表格資料
Object[] a1 = {1001,"高大",18,"講師","2006-2-14"};
Object[] a2 = {1002,"高小七",19,"助教","2007-10-10"};
Object[] a3 = {1003,"高小琴",20,"班主任","2008-5-5"};
Object[][] emps = new Object[3][];
emps[0] = a1;
emps[1] = a2;
emps[2] = a3;
四、陣列的資料操作
1、氣泡排序
(1)基礎演算法
public static void bubbleSort(int[] values) {
int temp;
for (int i = 0; i < values.length; i++) {
for (int j = 0; j < values.length - 1 - i; j++) {
if (values[j] > values[j + 1]) {
temp = values[j];
values[j] = values[j + 1];
values[j + 1] = temp;
}
}
}
}
(2)優化演算法
public static void bubbleSort(int[] values) {
int temp;
int i;
// 外層迴圈:n個元素排序,則至多需要n-1趟迴圈
for (i = 0; i < values.length - 1; i++) {
// 定義一個布林型別的變數,標記陣列是否已達到有序狀態
boolean flag = true;
/*內層迴圈:每一趟迴圈都從數列的前兩個元素開始進行比較,比較到無序陣列的最後*/
for (int j = 0; j < values.length - 1 - i; j++) {
// 如果前一個元素大於後一個元素,則交換兩元素的值;
if (values[j] > values[j + 1]) {
temp = values[j];
values[j] = values[j + 1];
values[j + 1] = temp;
//本趟發生了交換,表明該陣列在本趟處於無序狀態,需要繼續比較;
flag = false;
}
}
//根據標記量的值判斷陣列是否有序,如果有序,則退出;無序,則繼續迴圈。
if (flag) {
break;
}
}
}
(3) 總結:
- 採用巢狀 for 迴圈;
- 外層迴圈控制趟數;
- 內層迴圈控制每趟比較的次數;
- 優化就是加入一個有序的判斷;
2、二分查詢
public static int binarySearch(int[] array, int value){
int low = 0;
int high = array.length - 1;
while(low <= high){
int middle = (low + high) / 2;
if(value == array[middle]){
return middle; //返回查詢到的索引位置
}
if(value > array[middle]){
low = middle + 1;
}
if(value < array[middle]){
high = middle - 1;
}
}
return -1; //上面迴圈完畢,說明未找到,返回-1
}