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

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

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

我們學習 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。

Bagaimanapun, menggunakan tatasusunan di belakang tabir adalah perkara yang paling kerap berlaku dalam kehidupan sebenar. Walaupun tatasusunan berprestasi, ia adalah lebih rumit untuk mengulang elemennya dan terdapat kelas yang membuat abstraksi di atas tatasusunan yang menjadikan kehidupan pengaturcara lebih mudah.

Ini adalah kes dengan kelas Arrays (dengan huruf besar). Ia pada asasnya membungkus tatasusunan dalam kelas Java standard dan membentangkan satu siri kaedah yang sangat mudah untuk melaksanakan untuk bekerja dengan data. Kelas Arrays mempunyai satu lagi kelebihan hebat: ia berfungsi dengan peruntukan dinamik, jadi lebih mudah untuk menangani koleksi - lagipun, kita jarang mengetahui saiz tepat tatasusunan yang mungkin kita perlukan. Kelas Tatasusunan boleh mengembangkan saiz koleksi atas permintaan, tanpa pengaturcara perlu mencipta tatasusunan baharu (dengan huruf kecil) bersaiz lebih besar dan menyalin data daripada tatasusunan sebelumnya, yang tiba-tiba menjadi terlalu kecil.

Array juga merupakan asas kelas seperti List, Stack dan Queue (yang pada asasnya adalah bungkus dan termasuk kaedah yang sangat baik untuk menangani data).

Pernahkah anda berfikir bahawa String ialah kelas yang mengabstrakkan tatasusunan aksara?

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

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

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