1 數組 1.1 數組的概念 1.1.1 數組基礎 數組(Array)是相同數據類型的數據的有序集合。java
數組描述的是相同類型的若干個數據,按照必定的前後次序排列組合而成。其中,每個數據稱做一個數組元素(item),每一個數組元素能夠經過一個下標/索引來(index)訪問它們.算法
數組是引用數據類型。數組
數組的三個特色 [1]數組長度是肯定。數組一旦申請完空間,長度不能發生變化,用length屬性訪問。 [2]數組的元素都是同一數據類型。 [3]數組是有序的 。每一個元素經過下標/索引標記,索引從0開始。 1.1.2 內存空間分類(C) 內存分爲兩類: 棧(stack)內存:基本數據類型分配在棧內存,棧內存空間不須要開發者回收,系統會自動回收。棧空間佔整個內存空間的比例較小。jvm
堆(heap)內存:引用數據類型分配在堆內存,堆內存必定要開發者經過new 來申請,開發者申請的內存使用完成後必定要回收。jvm中有專門的垃圾回收機制(gc)回收使用完的堆內存。堆空間佔整個內存空間的比例較大。code
1.2 數組的聲明 聲明數組有兩種方式 數據類型[] 變量 -–>推薦寫法排序
數據類型 變量[]索引
案例:聲明一個數組申請空間並賦值 public class Test01{ public static void main(String[] args){ // 聲明一個數組 // int arr[];內存
int a; // 【1】聲明數組變量 int[] arr; // 【2】給數組變量分配空間 // 給arr申請了5個連續的整形的int空間。 arr = new int[5]; // 【3】給每一個空間賦值 arr[0] = 10; arr[1] = 20; arr[2] = 30; arr[3] = 40; arr[4] = 50; // 【4】訪問元素 System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); // System.out.println(arr[5]); }
}開發
1.2.1 數組的內存空間it
1.2.2 數組聲明的其餘方式 標準的聲明和賦值方法過於複雜,能夠使用簡寫的方式 數據類型[] arr = new int[]{值1,值2,…} jvm根據後面值的個數申請空間並把值賦值到對於空間。
public class Test02{ public static void main(String[] args){
// 【1】數組的聲明方式 int[] arr = new int[5]; arr[0] = 10; arr[1] = 20; System.out.println(arr); // 【2】值聲明 int[] arr2; arr2 = new int[]{10,20,30,40,50}; // int[] arr2 = new int[]{10,20,30,40,50}; System.out.println(arr2.length); System.out.println(arr2[0]); System.out.println(arr2[4]); // 【3】數組的字面量聲明 int[] arr3 = {10,20,30,40}; // 字面量聲明不支持分開賦值 /* int[] arr3; arr3 = {10,20,30,40}; */ System.out.println(arr3.length); System.out.println(arr3[0]); System.out.println(arr3[3]); }
}
1.2.3 數組的遍歷 public class Test03{ public static void main(String[] args){
int[] arr = {10,20,30,40,50}; // 0-4 for(int i=0;i < arr.length;i++){ System.out.println("arr[" + i + "]" + "=" + arr[i]); } }
}
需求:從控制檯輸入5個學生的成績,並求平均分? import java.util.Scanner; public class Test04{ public static void main(String[] args){
float[] arr = new float[5]; Scanner sc = new Scanner(System.in); float sum = 0.0f; for(int i=0;i<arr.length;i++){ System.out.println("請輸入第"+(i+1)+"位學生成績:"); arr[i] = sc.nextFloat(); sum += arr[i]; } float avg = sum / arr.length; System.out.println("平均分:"+avg); }
}
1.3 數組的經常使用算法 1.3.1 插入算法 一個數組有序,添加一個元素後,數組依然有序。
public class Test07{ public static void main(String[] args){
// 一個有序的數組,向該數組中添加一個元素,數組依然有序。 int[] arr = {1,3,7,9,12,20,0}; int t = 0; // 【1】找位置 int loc = -1; // 表示t應該添加到的位置 for(int i = 0;i<arr.length-1;i++){ if(arr[i] >= t){ loc = i; break; } } System.out.println("loc = "+loc); if(loc < 0){ // 沒找到合適的位置 arr[arr.length-1] = t; }else{ // 【2】依次後移 for(int j=arr.length-1;j>loc;j--){ arr[j] = arr[j-1]; } // 【3】添加插入的值 arr[loc] = t; } // 驗證 for(int i = 0;i<arr.length;i++){ System.out.print(arr[i]+"\t"); } }
}
1.3.2 刪除算法 一個有序的數組,刪除一個元素後依然有序。
public class Test08{ public static void main(String[] args){
// 刪除算法 int[] arr = {1,3,7,9,12,20}; int t = 1; // 【1】找位置 int loc = -1; for(int i=0;i<arr.length;i++){ if(t == arr[i]){ loc = i; break; } } // 【2】移動元素 if(loc < 0){ System.out.println(t+"在數組中不存在"); }else{ for(int j = loc;j<arr.length-1;j++){ arr[j] = arr[j+1]; } // 【3】最後一個元素置0 arr[arr.length-1] = 0; } // 驗證 for(int i = 0;i<arr.length;i++){ System.out.print(arr[i]+"\t"); } }
}
1.3.3 冒泡排序算法