目錄
- JAVA陣列的基礎入門
- 什么是陣列,什么情況下使用陣列
- 陣列的創建方式
- 獲取陣列的資料
- 陣列的記憶體模型
- 為什么陣列查詢修改快,而增刪慢?
- 查詢快的原因
- 增刪慢的原因
- 陣列的兩種遍歷方式以及區別
- fori的遍歷方式
- 陣列獲取極值及其索引
- 增強foreach的遍歷方式
- 兩種遍歷方式區別
- JAVA陣列的基礎入門
- 什么是陣列,什么情況下使用陣列
- 陣列的創建方式
- 獲取陣列的資料
- 陣列的記憶體模型
- 為什么陣列查詢修改快,而增刪慢?
- 查詢快的原因
- 增刪慢的原因
- 陣列的兩種遍歷方式以及區別
- fori的遍歷方式
- 增強foreach的遍歷方式
- 兩種遍歷方式區別
- 陣列的小練習,獲取極值及索引、陣列的擴容及縮容
- 獲取極值及其索引
- 在陣列指定索引位置插入資料
- 洗掉陣列指定位置資料
- Arrays工具類的使用以及System.arraycopy()方法的使用
- Arrays工具類
- System.arraycopy()方法的使用
- 綜合案例練習
JAVA陣列的基礎入門
什么是陣列,什么情況下使用陣列
- 陣列是一個存盤多個相同型別資料的容器
- 當需要將大量相同資料型別存盤起來并且不需要怎么進行增刪資料時
陣列的創建方式
- 靜態創建方式(當陣列創建時就已經有了值)
int[] arr1 = {1,3,5,6};
int[] arr2 = new int[]{1,3,5,6,8,1};
- 動態創建方式(創建時只指定長度并分配默認值),默認值就是每個資料型別的默認值
int[] arr3 = new[10];
獲取陣列的資料
// 陣列的每一個元素都會有一個對應的索引(下標),索引從0開始
int[] arr4 = {1,3,5,6};// 這其中索引從0開始,也就是其中的1的索引為0,3的索引為1,以此類推
// 那么要獲取到其中的數字6
System.out.println(arr4[3]);
陣列的記憶體模型
// 堆疊中的main函式在執行到該條陳述句時
/*
1、會創建一個int陣列物件,放在堆記憶體中,(其物件的值是一片連續的區域,每一個索引位置都對應著一個記憶體地址)理解為物件是一個地址,其中的元素也有對應的記憶體地址
2、堆疊記憶體中會創建一個資料型別為 int[],并且名稱為arr5的參考,然后用該參考指向堆記憶體中的剛剛創建的物件的記憶體地址
*/
int[] arr5 = {3,4,5,6};
為什么陣列查詢修改快,而增刪慢?
查詢快的原因
- 因為陣列擁有索引,而每個索引所對應的資料都會有一個記憶體地址
- 每次使用索引查找資料時,都會經過一個演算法 (第一個索引的記憶體地址 + 當前索引 * 資料大小)來快速定位到當前索引所指向的記憶體地址,所以查詢很快
增刪慢的原因
- 增刪慢是因為陣列是一片連續的區域,按理來說陣列創建后長度就是固定的,所以增加與洗掉陣列實際上都是創建一個新的陣列
- 而創建了一個新的陣列后還要將陣列進行重新的資料編排以此來完成資料的增刪操作,所以速度慢
陣列的兩種遍歷方式以及區別
fori的遍歷方式
int[] arr6 = {8,9,5,4,7,3,1};
for(int i = 0; i < arr6.length; i++) {
System.out.println("arr6[" + i + "] = " + arr6[i]);
}
陣列獲取極值及其索引
/*
要求,1、從鍵盤輸入一段陣列,期間中空格隔開
2、要求輸出最大值以及最大值的索引位置
提示:不用鍵盤輸入,直接定義一個陣列也是可以的,
*/
try (Scanner scanner = new Scanner(System.in)) {
String[] strings = scanner.nextLine().split(" ");
// 將String[]轉換為int[]
int[] arrs = Arrays.stream(strings).mapToInt(Integer::valueOf).toArray();
// 上面的兩行代碼如果不熟悉的話可以直接定義一個陣列,例如: int[] arrs = {1,3,5,12,33,12,15,46};
// 獲取陣列最大值
int max = arrs[0];
int index = 0;
for (int i = 0; i < arrs.length; i++) {
if(max < arrs[i]) {
max = arrs[i];
index = i;
}
}
System.out.println("最大值為" + max + " 在陣列中的位置為:" + index);
}
增強foreach的遍歷方式
int[] arr6 = {8,9,5,4,7,3,1};
for(int item : arr6) {
System.out.println(item);
}
兩種遍歷方式區別
- fori有索引位置,foreach沒有
- fori遍歷出來的每個元素都指向記憶體地址,foreach遍歷出來的每個元素都是一個臨時存盤區域變數
- 按照第二條所得結論,fori遍歷時可以修改陣列中的元素,而foreach不可以在遍歷時修改陣列的元素
JAVA陣列的基礎入門
什么是陣列,什么情況下使用陣列
- 陣列是一個存盤多個相同型別資料的容器
- 當需要將大量相同資料型別存盤起來并且不需要怎么進行增刪資料時
陣列的創建方式
- 靜態創建方式(當陣列創建時就已經有了值)
int[] arr1 = {1,3,5,6};
int[] arr2 = new int[]{1,3,5,6,8,1};
- 動態創建方式(創建時只指定長度并分配默認值),默認值就是每個資料型別的默認值
int[] arr3 = new[10];
獲取陣列的資料
// 陣列的每一個元素都會有一個對應的索引(下標),索引從0開始
int[] arr4 = {1,3,5,6};// 這其中索引從0開始,也就是其中的1的索引為0,3的索引為1,以此類推
// 那么要獲取到其中的數字6
System.out.println(arr4[3]);
陣列的記憶體模型
// 堆疊中的main函式在執行到該條陳述句時
/*
1、會創建一個int陣列物件,放在堆記憶體中,(其物件的值是一片連續的區域,每一個索引位置都對應著一個記憶體地址)理解為物件是一個地址,其中的元素也有對應的記憶體地址
2、堆疊記憶體中會創建一個資料型別為 int[],并且名稱為arr5的參考,然后用該參考指向堆記憶體中的剛剛創建的物件的記憶體地址
*/
int[] arr5 = {3,4,5,6};
為什么陣列查詢修改快,而增刪慢?
查詢快的原因
- 因為陣列擁有索引,而每個索引所對應的資料都會有一個記憶體地址
- 每次使用索引查找資料時,都會經過一個演算法 (第一個索引的記憶體地址 + 當前索引 * 資料大小)來快速定位到當前索引所指向的記憶體地址,所以查詢很快
增刪慢的原因
- 增刪慢是因為陣列是一片連續的區域,按理來說陣列創建后長度就是固定的,所以增加與洗掉陣列實際上都是創建一個新的陣列
- 而創建了一個新的陣列后還要將陣列進行重新的資料編排以此來完成資料的增刪操作,所以速度慢
陣列的兩種遍歷方式以及區別
fori的遍歷方式
int[] arr6 = {8,9,5,4,7,3,1};
for(int i = 0; i < arr6.length; i++) {
System.out.println("arr6[" + i + "] = " + arr6[i]);
}
增強foreach的遍歷方式
int[] arr6 = {8,9,5,4,7,3,1};
for(int item : arr6) {
System.out.println(item);
}
兩種遍歷方式區別
- fori有索引位置,foreach沒有
- fori遍歷出來的每個元素都指向記憶體地址,foreach遍歷出來的每個元素都是一個臨時存盤區域變數
- 按照第二條所得結論,fori遍歷時可以修改陣列中的元素,而foreach不可以在遍歷時修改陣列的元素
陣列的小練習,獲取極值及索引、陣列的擴容及縮容
獲取極值及其索引
/*
要求,1、從鍵盤輸入一段陣列,期間中空格隔開
2、要求輸出最大值以及最大值的索引位置
提示:不用鍵盤輸入,直接定義一個陣列也是可以的,
*/
try (Scanner scanner = new Scanner(System.in)) {
String[] strings = scanner.nextLine().split(" ");
// 將String[]轉換為int[]
int[] arrs = Arrays.stream(strings).mapToInt(Integer::valueOf).toArray();
// 上面的兩行代碼如果不熟悉的話可以直接定義一個陣列,例如: int[] arrs = {1,3,5,12,33,12,15,46};
// 獲取陣列最大值
int max = arrs[0];
int index = 0;
for (int i = 0; i < arrs.length; i++) {
if(max < arrs[i]) {
max = arrs[i];
index = i;
}
}
System.out.println("最大值為" + max + " 在陣列中的位置為:" + index);
}
在陣列指定索引位置插入資料
// 方式1
public static int[] insertArrayElementByIndex(int[] arr, int index, int element) {
// 先動態創建一個陣列
int[] newArr = new int[arr.length + 1];
// 遍歷原陣列,獲取索引前的資料
for (int i = 0; i < index; i++) {
newArr[i] = arr[i];
}
// 將索引處的值賦值
newArr[index] = element;
// 遍歷索引后的資料
for (int i = index; i < arr.length; i++) {
newArr[i + 1] = arr[i];
}
return newArr;
}
// 方式2
public static int[] insertArrayElementByIndex2(int[] arr, int index, int element) {
// 先動態創建一個陣列
int[] newArr = new int[arr.length + 1];
// 遍歷原陣列,獲取索引前的資料
System.arraycopy(arr, 0, newArr, 0, index);
// 將索引處的值賦值
newArr[index] = element;
// 遍歷索引后的資料
System.arraycopy(arr, index, newArr, index + 1, arr.length - index);
return newArr;
}
洗掉陣列指定位置資料
// 方式1
public static int[] deleteArrayElementByIndex(int[] arr, int index) {
// 先動態創建一個陣列
int[] newArr = new int[arr.length - 1];
// 遍歷原陣列,獲取索引前的資料
for (int i = 0; i < index; i++) {
newArr[i] = arr[i];
}
// 遍歷索引后的資料,由于長度減少了,所以需要少遍歷一次給新陣列賦值
for (int i = index; i < arr.length - 1; i++) {
newArr[i] = arr[i + 1];
}
return newArr;
}
// 方式2
public static int[] deleteArrayElementByIndex2(int[] arr, int index) {
// 先動態創建一個陣列
int[] newArr = new int[arr.length - 1];
// 遍歷原陣列,獲取索引前的資料
System.arraycopy(arr, 0, newArr, 0 , index);
// 遍歷索引后的資料,由于長度減少了,所以需要少遍歷一次給新陣列賦值
System.arraycopy(arr, index + 1, newArr, index , arr.length - 1 - index);
return newArr;
}
Arrays工具類的使用以及System.arraycopy()方法的使用
Arrays工具類
Integer[] arr = {3, 5, 6, 1, 2, 5, 7};
// 倒敘排序陣列
Arrays.sort(arr, Collections.reverseOrder());
// 升序排序陣列
Arrays.sort(arr);
// 復制陣列
Integer[] copyArr = Arrays.copyOf(arr, arr.length);
// 將陣列轉換為一串字串
String arrStr = Arrays.toString(copyArr);
// 輸出結果為:[1, 2, 3, 5, 5, 6, 7]
System.out.println(arrStr);
// 使用二分查找法查找某個資料所在的索引位置
int index = Arrays.binarySearch(arr, 5);
System.out.println(index);
System.arraycopy()方法的使用
// System.arraycope()方法 復制整個陣列
/* 引數決議
* Object src: 原始陣列
* int srcPos: 從原始陣列的第幾個下標開始復制
* Object dest: 目標陣列,也就是要復制到該陣列中
* int destPos: 從目標陣列的第幾個下標開始復制
* int length: 一共需要復制幾個元素
* 提示一點:源陣列與目標陣列必須為相同型別的陣列
*/
int[] arr = {3,5,6,1,2,5,7};
int[] newArr = new int[arr.length];
System.arraycopy(arr, 0, newArr, 0, arr.length);
System.out.println(Arrays.toString(newArr));
綜合案例練習
/*
1、鍵盤輸入 [學生姓名 學生成績]后按回車,可以無限的錄入學生資訊
2、當輸入over按回車時停止鍵盤輸入
3、輸出學生的名次、姓名、成績
*/
public class Test4 {
public static void main(String[] args) {
Student[] stuArr = new Student[0];
Scanner scanner = new Scanner(System.in);
// 輸入學生資訊,格式為: 學生姓名 成績;使用標記over結束
while (true) {
String str = scanner.nextLine();
if ("over".equals(str)) {
break;
}
String[] s = str.split(" ");
Student student = new Student(s[0], Integer.parseInt(s[1]));
// 插入一個資料
stuArr = insertArrElement(stuArr, student);
}
Arrays.sort(stuArr, ((o1, o2) -> Integer.compare(o2.getScore(), o1.getScore())));
for (int i = 0; i < stuArr.length; i++) {
System.out.println("比賽名次為第" + (i + 1) + "名 姓名為:" +
stuArr[i].getName() + " 成績為:" + stuArr[i].getScore());
}
}
private static Student[] insertArrElement(Student[] stuArr, Student student) {
// 復制前面的所有內容,用這一行可以
//Student[] newArr = Arrays.copyOf(stuArr, stuArr.length + 1);
// 用這下面兩行也可以做到
Student[] newArr = new Student[stuArr.length + 1];
System.arraycopy(stuArr, 0, newArr, 0, stuArr.length);
// 將最后一位添加上
newArr[newArr.length - 1] = student;
return newArr;
}
}
class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", score=" + score +
'}';
}
}
運行效果如下
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/274671.html
標籤:其他

