Rumah  >  Artikel  >  Java  >  array[]: kelas khas yang diuruskan secara dalaman oleh JVM itu sendiri

array[]: kelas khas yang diuruskan secara dalaman oleh JVM itu sendiri

DDD
DDDasal
2024-09-12 20:16:10733semak imbas

Cara pertama kita semua diperkenalkan kepada kajian struktur data dalam Java (dan bahasa lain) adalah melalui tatasusunan. Di Java, tatasusunan ialah kelas, objek, anak Objek (seperti semua kelas). Walau bagaimanapun, ia adalah kelas dengan layanan istimewa dalam bahasa.

Tidak seperti kelas dan objek biasa, sintaks tatasusunan dan rawatannya diuruskan secara langsung oleh pengkompil dan JVM (Mesin Maya Java). Ini termasuk cara tatasusunan diperuntukkan, dimanipulasi dan diakses. Kelas ini tidak ditemui secara langsung dalam kod sumber.

Java secara automatik merawat tatasusunan sebagai tika kelas khas ini.

Jika anda menjalankan kod di bawah, anda akan melihat output berikut:

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());
    }
}

[Saya
class java.lang.Object

Nama kelas "[I" ini hanyalah nama simbolik yang dijana secara automatik, yang JVM gunakan untuk mewakili tatasusunan integer (int[]). Setiap jenis mempunyai nama simboliknya sendiri:

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

Kurungan "[" menunjukkan dimensi. Tatasusunan satu dimensi diwakili oleh [, manakala tatasusunan dua dimensi diwakili oleh [[, tatasusunan tiga dimensi diwakili oleh [[[... dan seterusnya.

Pengisytiharan

Untuk mengisytiharkan dan memulakan tatasusunan, adalah penting untuk menentukan jenis data dan saiz objek:

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 membolehkan anda meletakkan kurungan segi empat sama dalam nama pembolehubah dan bukannya jenis, contohnya: int intArray[] = new int[5]. Walau bagaimanapun, ini tidak disyorkan, kerana ia menyimpang daripada konvensyen.

Data yang disimpan dalam tatasusunan boleh diperuntukkan dalam ingatan "bersambung", iaitu, secara berurutan, oleh JVM. Untuk mengakses data, indeks digunakan dan indeks pertama tatasusunan sentiasa 0 dalam Java.

Sebagai contoh, untuk mengakses huruf 'a' charArray di atas, anda perlu mencarinya dengan charArray[0]. Huruf 'b' pula, berada dalam charArray[1] dan huruf 'c', dalam charArray[2]. Jika anda cuba mengakses indeks yang tidak wujud dalam tatasusunan, anda akan menerima ralat "IndexOutOfBounce". Sebagai contoh, sekiranya saya cuba mengakses nilai dalam charArray[3].

Saiz tatasusunan, setelah ditakrifkan dalam pengisytiharan, tidak boleh diubah. Jika saya mengisytiharkan bahawa charArray akan mempunyai 3 elemen, ia tidak akan mengandungi lebih daripada itu. Kurang ya... lebih tidak.

Dan di sini, tambahan. Nilai yang tidak terisi dalam tatasusunan akan menganggap nilai lalai yang sama seperti jenis tatasusunan. Sebagai contoh, dalam tatasusunan integer, nilai kosong akan diisi dengan 0. Dalam tatasusunan boolean, dengan palsu. Dalam tatasusunan rentetan, dengan nol.

Sama seperti saiz, jenis tatasusunan tidak boleh diubah. Tetapi adalah mungkin untuk menyalin tatasusunan dengan jenis yang berbeza, jika ia adalah subjenis daripada jenis yang sama. Mengelirukan, bukan? Contoh membantu: Integer dan Double ialah subjenis Nombor. Jadi...

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

Kod ini diterima oleh pengkompil. Walau bagaimanapun, berhati-hati diperlukan. Jika kami melakukan ini di sini, kami akan menjana ralat kompilasi:

numberArray[0] = 1.2;

Ini kerana integerArray dan numberArray menghala ke ruang memori yang sama. Walaupun numberArray menyokong double sebagai elemen pertamanya, integerArray tidak dan, oleh itu, numberArray tidak "dibenarkan" untuk menukar nilai indeks 0.

Ingatan

Suatu tatasusunan sentiasa boleh menyimpan data jenis yang sama, menerima primitif dan objek. Jika tatasusunan dibuat daripada integer, ia tidak akan menerima char, double, float, String... hanya nilai integer.

Tatasusunan itu sendiri ialah kelas (walaupun kelas istimewa) dan, oleh itu, disimpan pada Heap. Dengan cara ini, tatasusunan menyimpan alamat memori yang, seterusnya, mengandungi nilai yang dimasukkan dalam tatasusunan.

Suatu tatasusunan primitif memperuntukkan blok memori bersebelahan untuk menyimpan nilai secara langsung, manakala tatasusunan objek menyimpan rujukan (penunjuk) kepada objek, yang terletak di tempat lain dalam ingatan.

Ini bermakna kedua-dua tatasusunan jenis primitif (seperti int[]) dan tatasusunan objek (seperti String[]) disimpan pada timbunan. Dalam kes tatasusunan jenis primitif, nilai elemen tatasusunan juga disimpan terus pada timbunan, bersebelahan dengan tatasusunan itu sendiri. Dalam kes tatasusunan objek, objek yang ditunjuk oleh rujukan ini boleh diperuntukkan di lokasi yang berbeza pada timbunan.

Kaedah

Semua kelas tatasusunan mempunyai kaedah panjang dan pengklonan. Yang pertama mengembalikan saiz tatasusunan dan yang kedua membuat salinan tatasusunan kepada tatasusunan lain (dalam kes ini, penuding ke alamat memori yang sama).

Walau bagaimanapun, sebagai anak kepada kelas Objek (serta semua kelas dalam Java), tatasusunan juga mempunyai kaedah superclass: toString, equals dan hashCode.

그러나 배후에서 배열을 사용하는 것은 실제 생활에서 가장 많이 일어나는 일입니다. 배열이 성능이 뛰어나더라도 해당 요소를 반복하는 것은 훨씬 더 복잡하며 배열 위에 추상화를 만드는 클래스가 있어 프로그래머의 삶이 훨씬 단순해집니다.

Arrays 클래스(대문자 포함)의 경우입니다. 기본적으로 표준 Java 클래스의 배열을 패키징하고 데이터 작업을 위한 구현하기 매우 간단한 일련의 메서드를 제공합니다. Arrays 클래스에는 또 다른 강력한 이점이 있습니다. 동적 할당과 함께 작동하므로 컬렉션을 처리하기가 더 쉽습니다. 결국 필요한 배열의 정확한 크기를 거의 알 수 없습니다. Arrays 클래스는 프로그래머가 더 큰 크기의 새 배열(소문자)을 생성하고 갑자기 너무 작아진 이전 배열의 데이터를 복사할 필요 없이 필요에 따라 컬렉션의 크기를 확장할 수 있습니다.

배열은 List, Stack, Queue와 같은 클래스의 기초이기도 합니다(기본적으로 랩이며 데이터를 처리하기 위한 매우 좋은 방법을 포함함).

String이 문자 배열을 추상화하는 클래스라고 생각해 본 적이 있나요?

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

Atas ialah kandungan terperinci array[]: kelas khas yang diuruskan secara dalaman oleh JVM itu sendiri. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn