java---陣列(重點概念)
一、什麼是陣列
- 程式=演算法+資料結構
- 資料結構:把資料按照某種特定的結構儲存,設計一個合理的資料是解決問題的關鍵;
- 陣列:是一種用於儲存多個相同型別資料型別 的儲存模型;
- 陣列的特定結構:相同型別組成元素集合
- 通過氧元素的下標進行訪問,切下標從0開始,最大元素下標為[陣列長度-1];
二、陣列的定義:
宣告陣列:
- 資料型別[] 變數名:int[] arr:定義了一個int型別的陣列,陣列名為arr,推薦使用這種
- 資料型別 變數名[]:int arr[]:定義了一個int型別的變數,變數名為arr陣列
舉例:
int [] i=new int[5];//長度為5; 含義: int:陣列的元素型別必須為int i:陣列的名稱new:建立了一個數組物件 5:陣列的長度 1、初始值為int的預設值 2、元素為{0,0,0,0,0}
三、陣列的初始化之動態初始化
1、陣列初始化概述:
- java中的陣列必須先初始化後,才能使用;
- 所謂初始化:就是為陣列中的陣列元素分配記憶體空間,併為每個陣列元素賦值
2、陣列初始化方式:
- 動態初始化
- 靜態初始化
3、動態初始化
- 就是初始化時只指定陣列長度,由系統為陣列分配初始值;
- 格式:
**資料型別[] 變數名 = new 資料型別[陣列長度];** - int[] arr=new int[3];
4、三種初始化方式:
int[] i=new int[5];//長度為5;
int[] i=new int[]{0,1,2,3,4};//長度即為元素個數
int[] i={1,2,3,4,5};//直接初始化元素,長度為元素的個數 1、這種寫法只能再宣告時對其初始化不能用於賦值 2、int[] arr;arr={1,2,34,4};編譯錯誤 3、對於陣列的賦值只能對其元素進行賦值,不能對陣列定義直接賦值 4、可以採用第二種方式先用new關鍵字建立空間,再賦值arr=new[]{1,2,34,4}
四、陣列的訪問
陣列變數訪問方式:陣列名
陣列內部儲存的資料的訪問方式:陣列名[索引]
索引是陣列中資料的編導方式
作用:索引用於訪問陣列中的資料使用,陣列名[索引]等同於變數名,是一種特殊的變數名
特徵:
- 索引從0開始;
- 索引是連續的;
- 索引逐一增加,每次加1
1、foreach:
for (型別名 變數名:陣列名或集合名){ 迴圈體; }
2、引用型別:
- 引用型別變數:一段空間,物件的起始地址;
- 引用型別物件:一段空間,儲存資料;
- 引用型別變數=new ***();
3、二維陣列:
本質就是一維陣列;
陣列中的元素的型別是一維陣列型別;
變數:型別名[] 變數名;
物件:new 型別名整形表式;
五、記憶體分配:
1、java中記憶體分配:
java程式在執行時,需要在記憶體中分配空間,為了提高運算效率,就對空間進行了不同區域的劃分;
因為每一片區域都有特定的處理資料方式和記憶體管理方式
- 整形:初始值為0;
- 浮點數:初始值為0.0;
- 字元型:空字元;
- 布林型:初始值為false;
- 引用資料型別:預設值為null
2、棧記憶體:儲存區域性變數
定義在方法中的變數,例如:arr,使用完畢,立即消失
3、堆記憶體:儲存new出來的內容(實體,物件)
陣列在初始化時,會為儲存空間新增預設值
每一個new出來的東西都有一個地址值,使用完畢,會在垃圾回收器空閒時被回收
4、陣列記憶體圖(多個數組指向相同)
int[] arr=new int[3]; arr[0]=100; arr[1]=200; arr[2]=300; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); int[] arr2=arr; arr2[0]=111; arr2[1]=222; arr2[2]=333; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr2); System.out.println(arr2[0]); //結果: [I@1540e19d 100 200 300 [I@1540e19d 111 [I@1540e19d 111
六、陣列初始化之靜態初始化
- 靜態初始化:初始化時指定每個陣列元素的初始值,由系統決定陣列長度;
- 格式:資料型別[] 變數名=new 資料型別[]{資料1,資料2,資料3,........}
- 簡化格式:資料型別[] 變數名={資料1,資料2,資料3..........}
舉例:
int[] arr={1,2,3,4}; System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); } 結果: [I@1540e19d 1 2 3
七、陣列操作的兩個常見小問題:
1、索引越界:訪問了陣列中不存在的索引對於的元素,造成索引越界問題;
2、空指標異常:訪問了陣列已經不再指向堆記憶體的資料,造成空指標異常。
null:空值,引用資料型別的預設值,表示不指向任何有效物件
int[] arr=new int[3]; System.out.println(arr[3]);
異常:
ArrayIndexOutOfBoundsException:陣列索引越界異常
NullPointerException:空指標異常
int[] arr=new int[3]; // System.out.println(arr[3]); arr=null; System.out.println(arr[0]);
八、陣列常見操作:
1、獲取陣列元素的數量(.length):
int[] a=new int[]{4,6,7,8}; int len=a.length;//陣列的length屬性 System.out.println(len);//4
2、通過下標訪問陣列元素:
public class Numberjihe { public static void main(String[] args) { int[] b = { 4, 6, 9, 8, 7 };// b[0]----b[4] // 0,獲取最後一位元素值 System.out.println(b[b.length - 1]);// 7 System.out.println("---------"); // 1、獲取元素下標為奇數的元素 // 迴圈問題 條件:陣列的長度 變數:第一個元素 改變條件:%2==1 for (int i = 0; i < b.length; i++) { if (i % 2 == 1) { System.out.println(b[i]); } } // 2、交換元素下標為2和3的元素位置 int temp = b[2]; b[2] = b[3]; b[3] = temp; System.out.println(b[2]); System.out.println(b[3]); } }
3、獲取最值:
思路:
1、定義一個變數,用於儲存最大值(或最小值);-------------------int max;
2、取陣列中第一個資料作為變數的初始值;-----------------------------int max=arr[0];
3、與陣列中剩餘的資料逐個比對,每次比對將最大值儲存到變數中;------
for(int x=1;x<arr.length;x++){
if(arr[x]>max){
max=arr[x];
}
}
4、迴圈結束後列印變數的值
System,out.println(max);
九、遍歷陣列元素:
1、基本for迴圈
public class Number3 { public static void main(String[] args) { int[] a2 = new [] { 3, 6, 7, 9 }; // 基本for迴圈 for (int i = 0; i < a2.length; i++) { System.out.println(a2[i] + ""); } // jdk1.8提供了增強for迴圈 for (int i : a2) { System.out.println(i + ""); } } }
2、增強for迴圈
// jdk1.8提供了增強for迴圈 for (int i : a2) { System.out.println(i + ""); }
十、陣列的複製:
1、System.arrayCopy()方法:
public static void arrayCopy(Object src,int srcPos,Object dest,int desPos,int length)
- src:元陣列
- srcPos:原陣列的起始位置
- dest:目標陣列
- destPos:目標陣列的起始位置
- length:複製的長度
int[] c1 = {10,30,65,45}; int[] c2 = new int[4]; System.arraycopy(c1, 1, c2, 0, 3); System.out.println(Arrays.toString(c2));
如果目標陣列小於需要copy的長度時會報出ArraysIndexOutOfBoundsException
2、Arrays.copyOf()方法:
java.util.Arrays類實現了陣列複製的方法Arrays.copyOf(型別[] src,int length)
- src:原陣列
- length:複製的長度
int[] c1 = {10,30,65,45}; System.out.println("s:" + c1.length); c1 = Arrays.copyOf(c1, 3); System.out.println(Arrays.toString(c1));//擷取 System.out.println("t:" + c1.length);
結論:
- 當複製的長度小於新陣列,則擷取;
- 當複製的長度大於新陣列,則擴容;
- copyof方法使用時原陣列長度變化的原因:
- 原陣列長度不變;
- 原始碼中可以看出建立一個新陣列使用
十一、陣列的排序:
1、陣列的排序:
- 排序是最常見的演算法之一;
- 排序:將陣列元素按照從小到大或者從大到小的順序排列
- 常見的排序演算法:氣泡排序,選擇排序,插入排序,希爾排序,快速排序,歸併排序等等
2、氣泡排序:
演算法核心:比較相鄰兩個元素,將較大的元素互換
System.out.println("請輸入產生陣列的長度:"); Scanner scanner = new Scanner(System.in); int length = scanner.nextInt(); System.out.println("請輸入你要產生的陣列元素的範圍:"); int location = scanner.nextInt(); int[] arr = new int[length]; for (int i = 0; i < arr.length; i++) { Random random = new Random(); arr[i] = random.nextInt(location); } System.out.println("排序前:" + Arrays.toString(arr)); // 氣泡排序 for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[i]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } System.out.println("排序後:" + Arrays.toString(arr)); } }
System.out.println("排序前:" + Arrays.toString(arr)); //氣泡排序 Arrays.sort(arr); System.out.println("排序後:" + Arrays.toString(arr));