一、數組
數組(array)是多個相同數據類型按照一定順序排列的集合,並使用一個名字命名,並通過編號的方式對這些數據進行統一管理
數組的相關概念:
- 數組名
- 元素
- 角標(下標、索引):數組的索引從0開始,到數組長度-1結束
- 長度
數組的特點:
- 數據是有序排列的
- 數組是引用類型變量。數組的元素可以是基本數據類型,也可以是引用數據類型
- 數據對象會在內存開辟一塊連續的空間
- 數組的長度一旦確定,不能更改
數組的分類:
- 按照維數:一維數組、二維數組……
- 按照數組元素類型:基本數據類型元素的數組、引用數據類型元素的數組
一維數組的使用:
- 一維數組的聲明和初始化
-
int[] ids; // 聲明 ids = new int[]{1001, 1002, 1003, 1004}; // 靜態初始化:數組的初始化和數組元素的賦值同時進行 String[] names = new String[5]; //動態初始化:數組的初始化和數組元素的賦值分開進行
-
- 如何調用數組指定位置的元素
-
names[0] = "小陳"; names[1] = "小吳"; names[2] = "小李"; names[3] = "老鄧"; names[4] = "小王"; // names[5] = "小鄧"; // 報錯,java.lang.ArrayIndexOutOfBoundsException
-
- 如何獲取數組的長度
-
System.out.println(names.length); // 5
-
- 如何遍歷數組
-
for (int i=0;i<names.length;i++){ System.out.println(names[i]); }
-
- 數組元素的默認初始化值
- 數組元素是整形:0
- 數組元素是浮點型:0.0
- 數組元素是char型:0或'\u0000',而非'0'
- 數組元素是布爾值:false
- 數組元素是引用數據類型:null
-
String[] arr = new String[4]; for (int i=0;i<arr.length;i++){ System.out.print(arr[i] + "\t"); } // null null null null
- 數組的內存解析
- 簡化版內存結構
例題:UN公社單間短期出租4個月,1550元/月(水電煤公攤,網費35元/月),空調、衛生間、廚房齊全。屋內均是IT行業人員,喜歡安靜。所以要求來租者最好是同行或者剛畢業的年輕人,愛干凈。安靜,聯系方式:
public class TestDemo { public static void main(String[] args) { int[] arr = new int[]{8, 2, 1, 0, 3}; int[] index = new int[]{2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3}; String tel = ""; for (int i = 0; i < index.length; i++) { tel += arr[index[i]]; } System.out.println("聯系方式:" + tel); } }
二維數組的使用
對於二維數組的理解,我們可以看成是以為數組array1又作為另一個一維數組array2的元素而存在。其實,從數組底層的運行機制來看,沒有多維數組
- 二維數組的聲明和初始化
-
public class TestDemo { public static void main(String[] args) { int[][] ids; // 聲明 ids = new int[][]{{1,2,3},{4,5},{6,7,8,9}}; // 靜態初始化:數組的初始化和數組元素的賦值同時進行 int[][] ids2= {{1,2,3},{4,5},{6,7,8,9}}; //類型推斷,也是正確寫法 String[][] names = new String[3][2]; //動態初始化1:數組的初始化和數組元素的賦值分開進行 String[][] names2 = new String[3][]; //動態初始化2:數組的初始化和數組元素的賦值分開進行 String[] names3[] = new String[3][]; //也是正確寫法 } }
-
- 如何調用數組指定位置的元素
-
System.out.println(ids[0][1]); //2 System.out.println(names[1][1]); //null System.out.println(names2[1]); //null names2[1] = new String[4]; System.out.println(names2[1][1]); //null
-
- 如何獲取數組的長度
-
System.out.println(names.length); //3 System.out.println(ids[2].length); //4
-
- 如何遍歷數組
-
for(int i=0;i<ids.length;i++){ for(int j=0;j<ids[i].length;j++){ System.out.print(ids[i][j]+"\t"); } System.out.println(); } // 1 2 3 // 4 5 // 6 7 8 9
-
- 數組元素的默認初始化值
- 針對初始化方式一:比如:int[][] arr = new int[4][3];
- 外層元素的初始化值為:地址值
- 內層元素的初始化值為:與一位數組初始化值情況相同
- 針對初始化方式二:比如:int[][] arr = new int[4][];
- 外層元素的初始化值為:null
- 內層元素的初始化值為:不能調用,報空指針錯誤
- 數組的內存解析
例題:
1、打印楊輝三角
public class TestDemo { public static void main(String[] args) { // 楊輝三角 int[][] yangHui= new int[10][]; for(int i=0;i<yangHui.length;i++){ yangHui[i]=new int[i+1]; yangHui[i][0] = yangHui[i][i] = 1; // 首尾賦值為1 // 給中間位置賦值 for(int j=1;j<yangHui[i].length-1;j++){ yangHui[i][j]=yangHui[i-1][j-1]+yangHui[i-1][j]; } } // 遍歷數組 for(int i=0;i<yangHui.length;i++){ for (int j=0;j<yangHui[i].length;j++){ System.out.print(yangHui[i][j]+"\t"); } System.out.println(); } } }
2、創建一個長度為6的int型數組,要求取值為1-30,同時元素值各不相同
public class TestDemo { public static void main(String[] args) { // 創建一個長度為6的int型數組,要求取值為1-30,同時元素值各不相同 int[] arr = new int[6]; for (int i = 0; i < arr.length; i++) { arr[i] = (int) (Math.random() * 30 + 1); for (int j = 0; j < i; j++) { if (arr[i] == arr[j]) { i--; break; } } } for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + "\t"); } } }
3、求數組中元素的最大值、最小值、平均數、總和
定義一個int型的一維數組,包含10個元素,分別賦一些隨機數,然后求出所有元素的最大值、最小值、和值、平均數,並輸出
要求:所有隨機數都是兩位數
public class TestDemo { public static void main(String[] args) { //定義一個int型的一維數組,包含10個元素,分別賦一些隨機數,然后求出所有元素的最大值、最小值、和值、平均數,並輸出 //要求:所有隨機數都是兩位數[10,99] int[] arr = new int[10]; for (int i = 0; i < arr.length; i++) { arr[i] = (int) (Math.random() * 88 + 10); //公式:[a,b]:(int) (Math.random() * (b-a+1) + a) System.out.print(arr[i] + "\t"); } System.out.println(); // 最大值 int maxValue = arr[0]; for (int i = 1; i < arr.length; i++) { if (maxValue < arr[i]) { maxValue = arr[i]; } } System.out.println("最大值:" + maxValue); // 最小值 int minValue = arr[0]; for (int i = 1; i < arr.length; i++) { if (minValue > arr[i]) { minValue = arr[i]; } } System.out.println("最小值:" + minValue); // 和值 int sum = 0; for (int i = 0; i < arr.length; i++) { sum += arr[i]; } System.out.println("總和值:" + sum); // 平均值 double avg = sum / arr.length; System.out.println("平均值:" + avg); } }
4、數組的引用
public class TestDemo { public static void main(String[] args) { int[] arry1,arry2; arry1=new int[]{8,9,65,32,56,23,7,5,43}; arry2=arry1; // arry2引用指向arry1,注意此時arry1與arry2是同一個數組,不是復制 // 此時修改arry1的值后,arry2的值會隨之修改 for(int i=0;i<arry1.length;i++){ if(i%2==0){ arry1[i] = i; } } for(int i=0;i<arry2.length;i++){ System.out.print(arry2[i]+"\t"); // 0 9 2 32 4 23 6 5 8 } } }
5、數組的復制
public class TestDemo { public static void main(String[] args) { int[] arry1,arry2; arry1=new int[]{8,9,65,32,56,23,7,5,43}; arry2=new int[9]; // 復制數組arry1 for(int i=0;i<arry1.length;i++){ arry2[i]=arry1[i]; } for(int i=0;i<arry1.length;i++){ if(i%2==0){ arry1[i] = i; //此時修改arry1后,arry2的值不變 } } for(int i=0;i<arry2.length;i++){ System.out.print(arry2[i]+"\t"); // 8 9 65 32 56 23 7 5 43 } } }
6、數組的反轉
public class TestDemo { public static void main(String[] args) { int[] arry = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9}; // 數組的反轉 // 方法一 // for (int i = 0; i < arry.length / 2; i++) { // int temp = arry[i]; // arry[i] = arry[arry.length - i - 1]; // arry[arry.length - i - 1] = temp; // } // 方法二 for (int i = 0, j = arry.length - 1; i < j; i++, j--) { int temp = arry[i]; arry[i] = arry[j]; arry[j] = temp; } for (int i = 0; i < arry.length; i++) { System.out.print(arry[i] + "\t"); // 9 8 7 6 5 4 3 2 1 } } }
7、數組的線性查找
public class TestDemo { public static void main(String[] args) { String[] arry = new String[]{"aa", "bb", "cc", "dd", "ee", "ff", "gg"}; // 數組的查找 //線性查找(地毯式搜索) String dest = "gg"; boolean isFlag = true; for (int i = 0; i < arry.length; i++) { if (dest.equals(arry[i])) { System.out.println("找到了指定元素的位置:" + i); isFlag = false; break; } } if (isFlag) { System.out.print("很遺憾,沒有找到你要找的元素呢"); } } }
或
public class TestDemo { public static void main(String[] args) { String[] arry = new String[]{"aa", "bb", "cc", "dd", "ee", "ff", "gg"}; // 數組的查找 //線性查找(地毯式搜索) String dest = "gg"; for (int i = 0; i < arry.length; i++) { if (dest.equals(arry[i])) { System.out.println("找到了指定元素的位置:" + i); break; } if (i == arry.length -1) { System.out.print("很遺憾,沒有找到你要找的元素呢"); } } } }
8、數組的二分查找
public class TestDemo { public static void main(String[] args) { int[] arry = new int[]{-55, -23, -5, 3, 9, 13, 35, 46, 56, 67}; //二分法查找 //前提:查找的數組必須有序 int dest = 56; // 要查找的元素 int head = 0;//初始起始索引 int end = arry.length - 1;//初始的末尾索引 boolean isFlag = true; while (head <= end) { int middle = (head + end) / 2; //中間值 if (dest == arry[middle]) { System.out.println("找到了你要查找的元素,位置為:" + middle); isFlag = false; break; } else if (dest < arry[middle]) { end = middle - 1; } else if (dest > arry[middle]) { head = middle + 1; } } if (isFlag) { System.out.print("很遺憾,沒有找到你要找的元素呢"); } } }
數組排序
- 選擇排序
- 直接選擇排序
- 堆排序
- 交換排序
- 冒泡排序
- 快速排序
- 插入排序
- 直接插入排序
- 折半插入排序
- Shell排序
- 歸並排序
- 桶式排序
- 基數排序
冒泡排序舉例
public class TestDemo { public static void main(String[] args) { int[] arr = new int[]{-55, -23, -5, 3, 9, 13, 35, 46, 56, 67}; // 冒泡排序 int temp; 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]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } //遍歷排序后的數組 for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + "\t"); } } }
快速排序
原理:
demo:
舉例:
public class QuickSort { private static void swap(int[] data, int i, int j) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } private static void subSort(int[] data, int start, int end) { if (start < end) { int base = data[start]; int low = start; int high = end + 1; while (true) { while (low < end && data[++low] - base <= 0) ; while (high > start && data[--high] - base >= 0) ; if (low < high) { swap(data, low, high); } else { break; } } swap(data, start, high); subSort(data, start, high - 1);//遞歸調用 subSort(data, high + 1, end); } } public static void quickSort(int[] data) { subSort(data, 0, data.length - 1); } public static void main(String[] args) { int[] data = {9, -16, 30, 23, -30, -49, 25, 21, 30}; System.out.println("排序之前:\n" + java.util.Arrays.toString(data)); quickSort(data); System.out.println("排序之后:\n" + java.util.Arrays.toString(data)); } }
排序算法性能對比