Java陣列
一、陣列簡介
- 陣列是多個相同型別資料的組合,實現對這些資料的統一管理
- 陣列屬引用型別,陣列型資料是物件(Object)
- 陣列中的元素可以是任何資料型別,包括基本型別和引用型別
- 陣列型別是單一,只能存放相同型別的資料
- 陣列一旦建立,大小就是固定的
- 陣列中每個元素都有自己的位置(下標),從0開始
所以陣列一般用來存放大小固定的資料:例如存放班級學生成績
int scores = {100,90,98,99,88,80}
二、建立陣列
關鍵陣列的關鍵字:[]
int [] a
和 int a[]
含義是一樣的,[]
和變數名
前後是沒有關係的。
2.1 只申明不賦值
type [] var;或者 type var [] ;
例如:
int score[];
int [] score;
Object [] obj; //Object是java語法中老祖宗
2.2 申明並賦值
type [] var = new type[size]; //建立的是資料,陣列的元素為空。值預設的就是該型別的預設值
type [] var = {elm,elem2,elem3,...} //建立的同時,把資料也賦值了
public static void main(String[] args) {
// 申明 預設值
int score[] = new int[9];
for(int i = 0;i<score.length;i++) {
System.out.print(score[i]+"\t");
}
System.out.println("------------");
//建立並且賦值
int score2[] = {100,90,88,85,66};
for(int i = 0;i<score2.length;i++) {
System.out.print(score2[i]+"\t");
}
2.3 new陣列記憶體模型
new:java中的關鍵字,主要作用用來在記憶體中,開闢新的空間,從而建立新的物件
2.4 下標操作元素
2.4.1 通過下標給元素賦值
int score[] = new int[9];
//指定元素賦值
score[2] = 10;
score[5] = 50;
2.4.2 通過下標獲取元素內容
int num2 = score[2];
System.out.println("num2="+num2);
for(int i = 0;i<score.length;i++) {
System.out.print(score[i]+"\t");
}
2.5 注意事項
- Java中使用關鍵字 new 建立陣列物件
- 定義並用運算子 new 為之分配空間後,才可以引用陣列中的每個元素;
- 陣列元素的引用方式:陣列名[陣列元素下標]
- 陣列元素下標可以是整型常量或整型表示式。如a[3] , b[i] , c[6*i];
- 陣列元素下標從0開始;長度為n的陣列合法下標取值範圍: 0 - n-1;如int a[]=new int[3]; 可引用的陣列元素為a[0]、a[1]、a[2]
- 每個陣列都有一個屬性 length 指明它的長度,例如:a.length 指明陣列 a 的長度(元素個數)
三、遍歷陣列
遍歷陣列可以通過下標,或者增強foreach迴圈來進行元素的遍歷
3.1 普通for迴圈
因為可以使用arr[index]
方式訪問元素,所以我們可以通過arr.length
來迴圈獲取不同索引的值;
但是注意:索引的範圍是:0-(length-1)
,不能大於等於length
因為下標是從0
開始計算。不然丟擲陣列越界異常
int score[] = {100,90,88,85,66};
for(int i = 0;i<score.length;i++) {
System.out.println(score2[i]);
}
以上就是將score陣列中所有的元素遍歷了一次,並列印出來
3.2 增強for迴圈
Java有一種功能很強的迴圈結構,可以用來依次處理陣列中的每個元素而不必為指定下標值而分心。
這種增強的for迴圈的語句格式為:
for(variable : arr)statement
例如:
int score[] = {100,90,88,85,66};
for(int ele:score){
System.out.println(ele);
}
這種語法和上面普通的for迴圈達到的效果是一樣的。這種for each
迴圈語句顯得更加簡潔、更不易出錯
四、陣列拷貝
如果希望將一個陣列的所有值拷貝到一個新的陣列中去,就要使用Arrays類的copyOf方法:
第2個引數是新陣列的長度。這個方法通常用來增加陣列的大小
int score[] = {100, 90, 88, 85, 66};
//長度超過原資料的部分:使用預設0替代
int[] newArr01 = Arrays.copyOf(score, 10);
//長度不足的,從前往後取對應的資料
int[] newArr02 = Arrays.copyOf(score, 3);
System.out.println("原陣列 = " + Arrays.toString(score));
System.out.println("新陣列1 = " + Arrays.toString(newArr01));
System.out.println("新陣列2 = " + Arrays.toString(newArr02));
注意事項:
- 如果陣列元素是數值型,那麼多餘的元素將被賦值為0;
- 如果陣列元素是布林型,則將賦值為false。
- 相反,如果長度小於原始陣列的長度,則只拷貝最前面的資料元素。
五、陣列排序
5.1 Arrays工具類排序
java.util.Arrays:屬於工具類,所以在使用之前,必須先導包
public static void main(String[] args) {
int score [] = {99,89,78,88,69,70};
String ch[] = {"B","C","A","F","D"};
System.out.println("排序前:");
for (int i = 0; i < ch.length; i++) {
System.out.print(ch[i]+"\t");
}
System.out.println();
//進行排序
//1.只提供了升序排序 從小到大 沒有提供降序。自己去實現
//2.也叫做自然順序。 A(65) B(66) C(67) D(68)
Arrays.sort(ch);
System.out.println("排序後:");
for (int i = 0; i < ch.length; i++) {
System.out.print(ch[i]+"\t");
}
}
4.2 通過演算法實現排序(冒泡)
升序為例:
- 將相鄰的兩個數,進行比較,將大的資料往後移動。依次迴圈進行比較,從而找到最大的資料
- 由於每一次迴圈只能確定一個資料,所以需要多次巢狀迴圈來完成最終的排序
- 詳細如下圖
public static void main(String[] args) {
int score [] = {99,89,78,88,69,70};
//i=0 {89,78,88,69,70,99};
//i=1 {78,88,69,70,89,99};
//i=2 {78,69,70,88,89,99};
System.out.println("第原始的結果:");
for (int j = 0; j < score.length; j++) {
System.out.print(score[j]+"\t");
}
System.out.println();
//排序:把前面幾次排好了,最後一個自動確定了位置 。少排序一次
//每次選一個最大的
for (int i = 0; i < score.length-1; i++) {
//相鄰的兩個進行比較,把大的往後移
for (int j = 0; j < score.length-1-i; j++) {
//如果說 前面比後面的大,兩者更換位置
if(score[j]>score[j+1]) {
//兩兩互換,通過臨時變數
int temp = score[j];
score[j] = score[j+1];
score[j+1] = temp;
}
}
System.out.println("第"+(i+1)+"次執行的結果:");
for (int j = 0; j < score.length; j++) {
System.out.print(score[j]+"\t");
}
System.out.println();
}
}