首頁 >Java >java教程 >array[]:由 JVM 本身內部管理的特殊類

array[]:由 JVM 本身內部管理的特殊類

DDD
DDD原創
2024-09-12 20:16:10867瀏覽

我們學習 Java(和其他語言)資料結構的第一種方式是透過陣列。在 Java 中,陣列是一個類別、一個物件、Object 的子層級(所有類別都是如此)。不過,這是一門在語言上有特殊待遇的課。

與常見的類別和物件不同,陣列的語法及其處理由編譯器和 JVM(Java 虛擬機器)直接管理。這包括數組的分配、操作和存取方式。原始碼中直接找不到這個類別。

Java 會自動將陣列視為這個特殊類別的實例。

如果執行下面的程式碼,您將看到以下輸出:

public class Main
{
    public static void main(String[] args) {
        int[] intArray = new int[5];
        System.out.println(intArray.getClass().getName());
        System.out.println(intArray.getClass().getSuperclass());
    }
}

[我
類別 java.lang.Object

這個類別名稱「[I」只是一個自動產生的符號名,JVM用它來表示一個整數陣列(int[])。每種類型都有自己的符號名稱:

array[]: uma classe especial gerenciada internamente pela própria JVM

括號“[”表示尺寸。一維數組用[表示,二維數組用[[表示,三維數組用[[[...等。

宣言

要宣告和初始化數組,指定物件的資料類型和大小非常重要:

int[] intArray = new int[5]; //array de tamanho 5
char[] charArray = new char[]{'a', 'b', 'c'}; //o compilador entende que é um array de tamanho 3
double[] doubleArray = {1.2, 1.3, 1.4, 1.5}; //o compilador entende que é um array de tamanho 4

Java允許你在變數名稱中放置方括號而不是類型,例如:int intArray[] = new int[5]。不過,不建議這樣做,因為它背離了慣例。

儲存在陣列中的資料可以在記憶體中「連續」分配,即由 JVM 依序分配。為了存取數據,需要使用索引,並且在 Java 中數組的第一個索引始終為 0。

例如,要存取上面的 charArray 中的字母“a”,您需要透過 charArray[0] 來搜尋它。字母「b」依序位於 charArray[1] 中,字母「c」位於 charArray[2] 中。如果您嘗試存取數組中不存在的索引,您將收到“IndexOutOfBounce”錯誤。例如,如果我嘗試存取 charArray[3] 中的值。

數組的大小一旦在聲明中定義,就永遠不能更改。如果我聲明 charArray 有 3 個元素,那麼它不會包含更多元素。少點「是」...多些「不」。

這裡是一個附錄。數組中未填入的值將採用與數組類型相同的預設值。例如,在整數陣列中,空值將以 0 填入。在布林數組中,用 false 填滿。在字串數組中,帶有 null。

就像大小一樣,陣列的類型無法變更。但如果不同類型的陣列是同一類型的子類型,則可以複製它們。令人困惑,對吧?一個範例可以幫助您:Integer 和 Double 是 Number 的子類型。所以...

Integer[] integerArray = {1, 2, 3};
Number[] numberArray = intgerArray;

這段程式碼被編譯器接受。然而,需要謹慎。如果我們在這裡這樣做,我們將產生一個編譯錯誤:

numberArray[0] = 1.2;

這是因為integerArray和numberArray指向同一個記憶體空間。儘管 numberArray 支援 double 作為其第一個元素,但 integerArray 不支持,因此,numberArray 不「允許」更改索引值 0。

記憶

陣列始終可以儲存相同類型的數據,接受基元和物件。如果陣列由整數組成,則它不接受 char、double、float、String...,僅接受整數值。

陣列本身是一個類別(儘管是一個特殊的類別),因此儲存在堆上。這樣,數組儲存了一個記憶體位址,該位址又包含了數組中輸入的值。

原始陣列分配連續的記憶體區塊來直接儲存值,而物件陣列則儲存位於記憶體其他位置的物件的參考(指標)。

這表示原始型別數組(如 int[])和物件數組(如 String[])都儲存在堆上。對於基本類型數組,數組元素的值也直接儲存在堆上,與數組本身相鄰。對於物件數組,這些引用指向的物件可以分配在堆上的不同位置。

方法

所有陣列類別都有長度和克隆方法。第一個傳回數組的大小,第二個將數組複製到另一個數組(在本例中是指向相同記憶體位址的指標)。

但是,作為 Object 類別(以及 Java 中的所有類別)的子類,陣列也具有超類別方法:toString、equals 和 hashCode。

然而,在幕後使用陣列是現實生活中最常發生的事情。儘管數組是高效能的,但迭代其元素要複雜得多,而且有些類別在數組之上進行抽象,這使程式設計師的生活變得更加簡單。

Arrays 類別就是這種情況(大寫字母)。它基本上將陣列封裝在標準 Java 類別中,並提供了一系列非常簡單的實作方法來處理資料。 Arrays 類別還有另一個強大的優點:它使用動態分配,因此更容易處理集合 - 畢竟,我們很少知道我們可能需要的陣列的確切大小。 Arrays 類別可以按需擴展集合的大小,而程式設計師無需建立更大尺寸的新陣列(帶有小寫字母)並從先前的陣列(突然變得太小)複製資料。

陣列也是 List、Stack 和 Queue 等類別的基礎(它們基本上是一個包裝,包含非常好的處理資料的方法)。

你有沒有想過 String 是抽象 char 陣列的類別?

array[]: uma classe especial gerenciada internamente pela própria JVM

以上是array[]:由 JVM 本身內部管理的特殊類的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn