『JavaSE』數組的定義

1. 數組基本用法

1.1 什麼是數組
數組本質上就是讓我們能 “批量” 創建相同類型的變量。在 Java 中, 數組中包含的變量必須是 相同類型。

1.2 創建數組

// 動態初始化
數據類型[] 數組名稱 = new 數據類型 [長度] { 初始化數據 };
// 靜態初始化
數據類型[] 數組名稱 = { 初始化數據 };

int[] arr = new int[3]{1, 2, 3};
int[] arr = {1, 2, 3};

注意事項: 靜態初始化的時候, 數組元素個數和初始化數據的格式是一致的.

1.3 數組的使用

代碼示例: 獲取長度 & 訪問元素&下標越界

int[] arr = {1, 2, 3};
// 獲取數組長度
System.out.println("length: " + arr.length); // 執行結果: 3

// 訪問數組中的元素
System.out.println(arr[1]); // 執行結果: 2
System.out.println(arr[0]); // 執行結果: 1

arr[2] = 100;
System.out.println(arr[2]); // 執行結果: 100

int[] arr = {1, 2, 3};
System.out.println(arr[100]);
// 執行結果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
at Test.main(Test.java:4)

注意事項
1.使用 arr.length 能夠獲取到數組的長度. . 這個操作爲成員訪問操作符. 後面在面向對象中會經常用到.
2.使用 [ ] 按下標取數組元素. 需要注意, 下標從 0 開始計數
3.使用 [ ] 操作既能讀取數據, 也能修改數據.
4.下標訪問操作不能超出有效範圍 [0, length - 1] , 如果超出有效範圍, 會出現下標越界異常

代碼示例: 遍歷數組
所謂 “遍歷” 是指將數組中的所有元素都訪問一遍, 不重不漏. 通常需要搭配循環語句.

int[] arr = {1, 2, 3};
for (int i = 0; i < arr.length; i++) {
	System.out.println(arr[i]);
}
// 執行結果
1 
2 
3

代碼示例: 使用 for-each 遍歷數組

int[] arr = {1, 2, 3};
for (int x : arr) {
	System.out.println(x);
}
// 執行結果
1
2 
3

for-each 是 for 循環的另外一種使用方式. 能夠更方便的完成對數組的遍歷. 可以避免循環條件和更新語句寫錯。

2. 數組作爲方法的參數

2.1 基本用法
代碼示例: 打印數組內容

public static void main(String[] args) {
	int[] arr = {1, 2, 3};
	printArray(arr);
}
public static void printArray(int[] a) {
	for (int x : a) {
		System.out.println(x);
	}
}
// 執行結果
1 
2 
3

int[] a 是函數的形參, int[] arr 是函數實參.
如果需要獲取到數組長度, 同樣可以使用 a.length

2.2引用類型
代碼示例1 參數傳內置類型

public static void main(String[] args) {
	int num = 0;
	func(num);
	System.out.println("num = " + num);
}
public static void func(int x) {
	x = 10;
	System.out.println("x = " + x);
}
// 執行結果
x = 10
num = 0

修改形參 x 的值, 不影響實參的 num 值

代碼示例2 參數傳數組類型

public static void main(String[] args) {
	int[] arr = {1, 2, 3};
	func(arr);
	System.out.println("arr[0] = " + arr[0]);
}
public static void func(int[] a) {
	a[0] = 10;
	System.out.println("a[0] = " + a[0]);
}
// 執行結果
a[0] = 10
arr[0] = 10

在函數內部修改數組內容, 函數外部也發生改變.此時數組名 arr 是一個 “引用” . 當傳參的時候, 是按照引用傳參。

如何理解內存?

內存就是指我們熟悉的 “內存”. 內存可以直觀的理解成一個宿舍樓. 有一個長長的大走廊, 上面有很多房間.
每個房間的大小是 1 Byte (如果計算機有 8G 內存, 則相當於有 80億 個這樣的房間).
每個房間上面又有一個門牌號, 這個門牌號就稱爲 地址

如何理解引用?

引用相當於一個 “別名”, 也可以理解成一個指針.
創建一個引用只是相當於創建了一個很小的變量, 這個變量保存了一個整數, 這個整數表示內存中的一個地址.

針對 int[] arr = new int[]{1, 2, 3} 這樣的代碼, 內存佈局如圖:
a) 當我們創建 new int[]{1, 2, 3} 的時候, 相當於創建了一塊內存空間保存三個 int
在這裏插入圖片描述
b) 接下來執行 int[] arr = new int[]{1, 2, 3} 相當於又創建了一個 int[] 變量, 這個變量是一個引用類型, 裏面只保存了一個整數(數組的起始內存地址)

在這裏插入圖片描述
c) 接下來我們進行傳參相當於 int[] a = arr , 內存佈局如圖在這裏插入圖片描述
d) 接下來我們修改 a[0] , 此時是根據 0x100 這樣的地址找到對應的內存位置, 將值改成 100

在這裏插入圖片描述

此時已經將 0x100 地址的數據改成了 100 . 那麼根據實參 arr 來獲取數組內容 arr[0] , 本質上也是獲取 0x100 地址上的數據, 也是 100.

總結: 所謂的 “引用” 本質上只是存了一個地址. Java 將數組設定成引用類型, 這樣的話後續進行數組參數傳參, 其實只是將數組的地址傳入到函數形參中. 這樣可以避免對整個數組的拷貝(數組可能比較長, 那麼拷貝開銷就會很大)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章