在 Java 中,數組是一種基本數據結構,用于存儲一系列相同類型的數據。在內存中,數組分配是一塊連續的內存空間,用于存儲數組中的所有元素。本篇文章將詳細解釋 Java 中數組的內存分配,包括數組的聲明、創建、內存模型以及垃圾回收等方面。
### 數組的聲明和創建
在 Java 中,數組可以是基本數據類型(如 int、double 等)的數組,也可以是對象類型(如 String、ArrayList 等)的數組。聲明和創建數組的方式也有所不同。
1. **基本數據類型的數組**
? ?聲明一個基本數據類型的數組,需要指定數組的長度,例如:
? ?```java
? ?int[] intArray = new int[5];
? ?```
? ?這行代碼中,`new int[5]` 創建了一個長度為 5 的整型數組,并將其引用賦值給變量 `intArray`。在內存中,這個數組會占用一段連續的內存空間,用于存儲 5 個整型元素。
2. **對象類型的數組**
? ?聲明一個對象類型的數組,同樣需要指定數組的長度,例如:
? ?```java
? ?String[] stringArray = new String[3];
? ?```
? ?這行代碼中,`new String[3]` 創建了一個長度為 3 的字符串數組,并將其引用賦值給變量 `stringArray`。在內存中,這個數組會占用一段連續的內存空間,用于存儲 3 個字符串對象。
### 數組的內存模型
在 Java 中,數組的內存模型可以分為兩個部分:數組對象本身和數組元素。
1. **數組對象**
? ?數組對象是數組的一個實例,包含數組的長度和數組元素的總大小。例如,一個長度為 5 的整型數組,其對象大小為 16 字節(4 字節的長度信息和 12 字節的數組元素大小)。
2. **數組元素**
? ?數組元素是數組中的單個數據項,它們存儲在連續的內存空間中。例如,一個長度為 5 的整型數組,其元素占用 20 字節的內存空間(5 個整型元素,每個元素 4 字節)。
### 數組的內存分配
當創建一個數組時,Java 虛擬機(JVM)會為數組對象分配內存,并在數組對象后面分配一段連續的內存空間用于存儲數組元素。
1. **基本數據類型的數組內存分配**
? ?對于基本數據類型的數組,數組元素直接存儲在數組對象的內存區域之后。例如,一個長度為 5 的整型數組,其內存布局如下:
? ?```
? ?+------+------+------+------+------+
? ?| intArray | ?int | ?int | ?int | ?int |
? ?+------+------+------+------+------+
? ?```
? ?其中,`intArray` 是數組對象的引用,后面跟著 5 個整型元素。
2. **對象類型的數組內存分配**
? ?對于對象類型的數組,數組元素也是存儲在連續的內存空間中,但每個元素都是一個對象。例如,一個長度為 3 的字符串數組,其內存布局如下:
? ?```
? ?+------+----------------+----------------+----------------+
? ?| stringArray | ?String | ?String | ?String |
? ?+------+----------------+----------------+----------------+
? ?```
? ?其中,`stringArray` 是數組對象的引用,后面跟著 3 個字符串對象。
### 數組的垃圾回收
在 Java 中,垃圾回收器會負責回收不再使用的對象占用的內存。當一個數組不再被引用時,垃圾回收器會回收這個數組對象及其元素占用的內存。
但是,如果數組被強引用,即使數組元素沒有引用,垃圾回收器也不會回收數組。因此,在某些情況下,需要將數組元素設置為 `null`,以便垃圾回收器可以回收它們占用的內存。
### 總結
在 Java 中,數組的內存分配是一塊連續的內存空間,用于存儲數組對象和數組元素。數組對象包含數組的長度和數組元素的總大小,而數組元素是數組中的單個數據項,它們存儲在連續