陣列是最常見的一種資料結構,它是相同型別的用一個識別符號封裝到一起的基本型別資料序列或者物件序列。陣列使用一個統一的陣列名和不同的下標來唯一確定陣列中的元素。實質上,陣列是一個簡單的線性序列,因此訪問速度很快
一維陣列
一組相同型別資料的線性集合,一旦宣告瞭陣列的大小,就不能再修改。
建立
資料型別[] 陣列名; 資料型別既可以是基本資料型別,也可以是引用資料型別
String[] name;
Person[] persons;
分配空間
分配空間就是要告訴計算機在記憶體中為它分配幾個連續的位置來儲存資料。在 Java 中可以使用 new 關鍵字來給陣列分配空間
name =new String[10];
persons =new Person[30];
建立並分配空間
int arr=new int[5];
初始化一維陣列
陣列可以進行初始化操作,在初始化陣列的同時,可以指定陣列的大小,也可以分別初始化陣列中的每一個元素
int[] number=new int[5];
number[0]=1;
number[1]=2;
number[2]=3;
number[3]=5;
number[4]=8;
//或
int[] number=new int[]{1, 2, 3, 4, 5};
//或
int[] number={1,2,3,5,8};
獲取元素
指定元素所在陣列的下標獲取
int[] number={1,2,3,4,5};
System.out.println(number[0]);//輸出1
遍歷
利用 for 迴圈語句遍歷 number 陣列中的全部元素
int[] number={1,2,3,4,5};
for (int i=0;i<number.length;i++)
{
System.out.println(number[i]);//依次輸出1,2,3,4,5
}
二維陣列
以第一個下標表示元素所在的行,第二個下標表示元素所在的列,二維陣列被看作陣列的陣列
建立
type 表示二維陣列的型別,array 表示陣列名稱,第一個中括號表示行,第二個中括號表示列
type[][] array;//例:int[][] age;
初始化
array=new type[][]{值 1,值 2,值 3,…,值 n};
array=new type[][]{new 構造方法(引數列),…};
type[][] array={{第1行第1列的值,第1行第2列的值,…},{第2行第1列的值,第2行第2列的值,…},…};
一個二行二列的二維陣列 temp,並對陣列中的元素進行了初始化
//方式一
int[][] temp;
temp =new int[][]
{
{1,2},{3,4}
};
//方式二
int[][] temp;
temp=new int [][]
{
{new int(1),new int(2)},{new int(3),new int(4)}
};
//方式三
int[][] temp={{1,2},{3,4}};
獲取元素
使用下標來獲取
array[i][j];
int[][] temp={{1,2},{3,4},{5,6}};
System.out.println(temp[1][1]);//輸出1
遍歷
在一維陣列中直接使用陣列的 length 屬性獲取陣列元素的個數。而在二維陣列中,直接使用 length 屬性獲取的是陣列的行數,在指定的索引後加上 length(如 array[0].length)表示的是該行擁有多少個元素,使用巢狀迴圈來遍歷二維陣列
public static void main(String[] args)
{
double[][] temp={{1,2},{3,4},{5,6}};
for(int i=0;i<temp.length;i++)
{
for(int j=0;j<temp[i].length;j++)
{
System.out.println("temp["+i+"]["+j+"]");
}
}
}
多維陣列
除了一維陣列和二維陣列外,Java 中還支援更多維的陣列,如三維陣列、四維陣列和五維陣列等,它們都屬於多維陣列
以三維陣列為例來介紹多維陣列,三維陣列有三個層次,可以將三維陣列理解為一個一維陣列,其內容的每個元素都是二維陣列。依此類推,可以獲取任意維數的陣列。
多維陣列的宣告、初始化和使用都與二維陣列相似。
array[i][j][r];
int[][][] temp={{1,2,1},{3,4,3},{5,6,5}};
System.out.println(temp[1][1][1]);//輸出1
其他與二維陣列基本相似
陣列比較
陣列相等的條件不僅要求陣列元素的個數必須相等,而且要求對應位置的元素也相等。Arrays 類提供了 equals() 方法比較整個陣列,arrayA 是用於比較的第一個陣列,arrayB 是用於比較的第二個陣列
Arrays.equals(arrayA, arrayB);
int[] arr1={1,2,3};
int[] arr2={1,2,3};
int[] arr3={1,2,3,4};
Arrays.equals(arr1, arr2);//ture
Arrays.equals(arr1, arr3);//false
陣列查詢
查詢陣列是指從陣列中查詢指定位置的元素,或者查詢某元素在指定陣列中的位置。使用 Arrays 類的 binarySearch() 方法可以實現陣列的查詢,該方法可使用二分搜尋法來搜尋指定陣列,以獲得指定物件,該方法返回要搜尋元素的索引值,binarySearch() 方法有多種過載形式來滿足不同型別陣列的查詢需要,常用的過載形式有兩種。
在進行陣列查詢之前,必須對陣列進行排序(可以使用 sort() 方法)。如果沒有對陣列進行排序,則結果是不確定的。如果陣列包含多個帶有指定值的元素,則無法確認找到的是哪一個
binarySearch(Object[] a,Object key);
a 表示要搜尋的陣列,key 表示要搜尋的值。如果 key 包含在陣列中,則返回搜尋值的索引;否則返回 -1 或“-插入點”。插入點指搜尋鍵將要插入陣列的位置,即第一個大於此鍵的元素索引
int[] arr={1,2,3};
Arrays.binarySearch(arr,1);//查到,位置0
Arrays.binarySearch(arr,4);//查不到,返回-1
binarySearch(Object[] a,int fromIndex,int toIndex,Object key);
a 表示要進行查詢的陣列,fromIndex 指定範圍的開始處索引(包含開始處),toIndex 指定範圍的結束處索引(不包含結束處),key 表示要搜尋的元素
int[] arr={1,2,3};
Arrays.binarySearch(arr,0,2,1);//查到,位置0
Arrays.binarySearch(arr,0,1,3);//查不到,返回-1
陣列複製
實現陣列複製有 4 種方法,分別為使用 Arrays 類的 copyOf() 方法和 copyOfRange() 方法、System 類的 arraycopy() 方法和 Object 類的 clone() 方法
copyOf()、copyOfRange()
copyOf() 方法是複製陣列至指定長度
Arrays.copyOf(dataType[] srcArray,int length);
srcArray 表示要進行復制的陣列,length 表示複製後的新陣列的長度,使用這種方法複製陣列時,預設從源陣列的第一個元素(索引值為 0)開始複製,目標陣列的長度將為 length。如果 length 大於 srcArray.length,則目標陣列中採用預設值填充(如:int型別陣列預設值為0);如果 length 小於 srcArray.length,則複製到第 length 個元素(索引值為 length-1)即止。
int arr[]=new int[]{1,2,3};
int[] newArr=(int[])Arrays.copyOf(arr,4);//新陣列1,2,3,0
copyOfRange() 方法則將指定陣列的指定長度複製到一個新陣列中
Arrays.copyOfRange(dataType[] srcArray,int startIndex,int endIndex)
srcArray 表示源陣列;startIndex 表示開始複製的起始索引,目標陣列中將包含起始索引對應的元素,另外,startIndex 必須在 0 到 srcArray.length 之間;endIndex 表示終止索引,目標陣列中將不包含終止索引對應的元素,endIndex 必須大於等於 startIndex,可以大於 srcArray.length,如果大於 srcArray.length,則目標陣列中使用預設值填充
int arr[]=new int[]{1,2,3};
int[] newArr=(int[])Arrays.copyOf(arr,1,4);//新陣列2,3,0
arraycopy()
arraycopy() 方法位於 java.lang.System 類中
System.arraycopy(dataType[] srcArray,int srcIndex,int destArray,int destIndex,int length)
srcArray 表示源陣列;srcIndex 表示源陣列中的起始索引;destArray 表示目標陣列;destIndex 表示目標陣列中的起始索引;length 表示要複製的陣列長度,length+srcIndex 必須小於等於 srcArray.length,同時 length+destIndex 必須小於等於 destArray.length
int arr[]=new int[]{1,2,3};
int newArr[]==new int[]{4,5,6};
System.arraycopy(arr,0, newArr,2,3);//新陣列4,2,6
clone()
clone() 方法也可以實現複製陣列。該方法是類 Object 中的方法,可以建立一個有單獨記憶體空間的物件。因為陣列也是一個 Object 類,因此也可以使用陣列物件的 clone() 方法來複制陣列
array_name.clone()
int[] targetArray=(int[])sourceArray.clone();
陣列排序
java.util.Arrays 類中的 sort() 方法對陣列進行排序分為以下兩步:匯入 java.util.Arrays 包。使用 Armys.sort(陣列名) 語法對陣列進行排序,排序規則是從小到大,即升序。
int[] arr=new int[]{1,5,4,3,6,2};
Arrays.sort(scores);//輸出 1,2,3,4,5,6
氣泡排序
氣泡排序(Bubble Sort)是常用的陣列排序演算法之一,氣泡排序的基本思想是:對比相鄰的元素值,如果滿足條件就交換元素值,把較小的元素值移動到陣列前面,把大的元素值移動到陣列後面(也就是交換兩個元素的位置),這樣陣列元素就像氣泡一樣從底部上升到頂部。
int[] arr={6,3,8,2,9,1};
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]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
快速排序
快速排序(Quicksort)是對氣泡排序的一種改進,快速排序的基本思想是:通過一趟排序,將要排序的資料分隔成獨立的兩部分,其中一部分的所有資料比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此使整個資料變成有序序列。
int[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
public static void quickSort(int[] arr,int low,int high){
int i,j,temp,t;
if(low>high){
return;
}
i=low;
j=high;
temp = arr[low];//temp就是基準位
while (i<j) {//先看右邊,依次往左遞減
while (temp<=arr[j]&&i<j) {
j--;
}
while (temp>=arr[i]&&i<j) {//再看左邊,依次往右遞增
i++;
}
if (i<j) {//如果滿足條件則交換
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最後將基準為與i和j相等位置的數字交換
arr[low] = arr[i];
arr[i] = temp;
//遞迴呼叫左半陣列
quickSort(arr, low, j-1);
//遞迴呼叫右半陣列
quickSort(arr, j+1, high);
}
quickSort(arr, 0, arr.length-1);
選擇排序
選擇排序法也可以對上述陣列中的元素進行排序,但是它與氣泡排序不同。選擇排序是指每一趟從待排序的資料元素中選出最大(或最小)的一個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完
int[] number={13,15,24,99,4,1};
int index;
for(int i=1;i<number.length;i++)
{
index=0;
for(int j=1;j<=number.length-i;j++)
{
if(number[j]>number[index])
{
index=j; //查詢最大值
}
}
int temp=number[number.length-i];
number[number.length-1]=number[index];
number[index]=temp;
}