Kolam konstan Java biasanya dibagi menjadi dua jenis: kolam konstan statis dan kolam runtime konstan
Static Constant Pool: Pool konstan di file kelas. Kumpulan konstan dalam file kelas mencakup nilai literal string (angka), informasi kelas dan metode, menempati sebagian besar ruang dalam file kelas.
Runtime Constant Pool: Setelah JVM selesai memuat kelas, memuat kumpulan konstan di file kelas ke dalam memori dan menyimpannya di area metode. Apa yang biasanya kita bicarakan adalah kumpulan konstan dari kolam runtime konstan di area metode. Fitur penting lain dari kumpulan konstannya dibandingkan dengan file kelas adalah dinamisitasnya. Bahasa Java tidak memerlukan konstanta untuk dihasilkan hanya selama periode kompilasi, yaitu, isi kumpulan konstan dalam file kelas dapat memasukkan kumpulan konstan runtime area metode. Selama pelarian, konstanta baru juga dapat ditempatkan di kolam renang. Fitur ini lebih umum digunakan oleh pengembang. Metode intern () dari kelas string.
Penghitung Program: adalah pipa untuk eksekusi program, menunjukkan perintah mana yang akan dieksekusi berikutnya.
Metode Lokal Tumpukan: Tumpukan yang digunakan oleh JVM untuk memanggil metode sistem operasi.
Tumpukan Mesin Virtual: Tumpukan yang Digunakan oleh JVM untuk mengeksekusi kode Java
Virtual Machine Heap: Di mana objek disimpan, dan semua objek yang baru dalam program Java disimpan di tumpukan.
Area metode: Simpan konstanta, informasi kelas, dan variabel statis, yang dapat dipahami sebagai lokasi di mana file kelas disimpan dalam memori.
Manfaat Pooling Konstan:
Kolam konstan digunakan untuk menghindari seringnya penciptaan dan penghancuran objek yang mempengaruhi kinerja sistem, dan mereka menyadari berbagi objek.
Misalnya, kumpulan string konstan digunakan untuk menempatkan semua literal string ke dalam kumpulan konstan selama tahap kompilasi.
1. Simpan Ruang Memori: Semua konstanta string dengan nilai literal yang sama di kumpulan konstan digabungkan, hanya mengambil satu ruang
2. Simpan Waktu Run: Saat melakukan perbandingan string, == lebih cepat dari Equals (). Untuk dua variabel referensi, cukup gunakan == untuk menentukan apakah referensi sama, sehingga Anda dapat menentukan apakah nilai aktual sama.
== makna tipe data dasar dan representasi objek berbeda.
Untuk tipe data dasar: == Perbandingan adalah nilai tipe data dasar untuk objek: == Perbandingan adalah alamat memori objek dalam memori
8 kelas pembungkus tipe data dasar dan kumpulan konstan
Sebagian besar kelas pembungkus tipe data dasar di Java menerapkan teknologi pengumpulan konstan, yaitu byte, pendek, integer, panjang, karakter, dan boolean.
Integer I1 = 40; Integer I2 = 40; System.out.println (i1 == i2); // Benar
Byte, pendek, integer, panjang, karakter, lima kelas pembungkus ini membuat data cache dari jenis yang sesuai dari [-128, 127] secara default dan menyimpannya di kumpulan konstan. Jika melebihi kisaran ini, objek baru masih akan dibuat.
Nilai integer statis publik (int i) {Assert integercache.high> = 127; if (i> = integercache.low && i <= integercache.high) mengembalikan integercache.cache [i + (-integercache.low)]; mengembalikan bilangan bulat baru (i); }Integer I1 = 400; Integer I2 = 400; System.out.println (i1 == i2); // false
2. Dua jenis kelas pengemasan bilangan floating floating float dan double tidak mengimplementasikan teknologi pengumpulan konstan.
D1 D1 = 2.5; D2 Double = 2.5; System.out.println (d1 == d2); // false
3. Skenario untuk Menerapkan Kolam Konstan
(1) .Integeri1 = 40; Karena Integer adalah kelas pembungkus dari tipe data dasar int dan merupakan objek, Java akan melakukan operasi tinju otomatis saat menyusun dan secara langsung merangkum kode ke integeri1 = integer.valueof (40), dengan demikian menggunakan objek di kumpulan konstan.
(2) .Integeri1 = newInteger (40); Dalam hal ini, objek baru akan dibuat
Integer I1 = 40; Integer I2 = Integer Baru (40); System.out.println (i1 == i2); // false
Dalam hal ini, bilangan bulat baru tidak akan melakukan referensi tinju otomatis konstanta yang ada di kumpulan konstan, tetapi akan secara langsung menghasilkan objek baru di tumpukan.
4. Detail Integer
Integer I1 = 40; Integer I2 = 40; Integer I3 = 0; Integer i4 = bilangan bulat baru (40); Integer i5 = bilangan bulat baru (40); Integer i6 = bilangan bulat baru (0); Integer I7 = 128; Integer I8 = 128; System.out.println ("i1 = i2" + (i1 == i2)); System.out.println ("i1 = i2 + i3" + (i1 == i2 + i3)); System.out.println ("i1 = i4" + (i1 == i4)); System.out.println ("i4 = i5" + (i4 == i5)); System.out.println ("i4 = i5 + i6" + (i4 == i5 + i6)); System.out.println ("40 = i5 + i6" + (40 == i5 + i6)); System.out.println ("i7 = i8" + (i7 == i8));i1 = i2 trueI1 = i2+i3 trueI1 = i4 falsei4 = i5 falsei4 = i5+i6 true40 = i5+i6 trueI7 = i8 false
Penjelasan: Pernyataan I4 == i5 + i6, karena operator + tidak berlaku untuk objek integer. Pertama, i5 dan i6 melakukan operasi unboxing otomatis dan menambahkan nilai, yaitu, i4 == 40. Maka objek integer tidak dapat secara langsung dibandingkan dengan nilai numerik, jadi I4 secara otomatis unboxes dan mengubahnya menjadi nilai int 40. Akhirnya, pernyataan ini dikonversi menjadi 40 == 40 untuk perbandingan numerik.
Kelas string dan kumpulan konstan
1. Bagaimana membuat objek String
String s1 = "abdcd"; string s2 = string baru ("abcd"); system.out.println (s1 == s2); // falseAda perbedaan dalam metode penciptaan dari dua cara yang berbeda ini. Yang pertama adalah mengambil objek di kumpulan konstan, dan yang kedua adalah membuat objek baru di ruang memori heap.
Cukup gunakan objek baru akan dibuat di tumpukan.
2. Ekspresi Koneksi+
(1). Hanya objek baru yang dihasilkan oleh koneksi "+" antara objek string yang dibuat menggunakan "" Teks yang berisi akan ditambahkan ke kumpulan konstanta string.
(2). Untuk bentuk lain seperti dua referensi objek yang terhubung langsung melalui "+" atau objek yang dibuat melalui mode baru, objek baru yang dihasilkan tidak akan ditambahkan ke kumpulan konstanta string.
String str1 = "str"; string str2 = "ing"; String str3 = "str" + "ing"; string str4 = str1 + str2; system.out.println (str3 == str4); // false string str5 = "string"; system.out.println (str3 == str5); // true ";
string akhir statis public a = "ab"; // string final statis apublik konstan b = "cd"; // konstan bpublic static void main (string [] args) {string s = a + b; // inisialisasi s dengan + string concatenation t = "abcd"; if (s == t) {System.out.println ("S sama dengan T, mereka adalah objek yang sama"); } else {System.out.println ("s tidak sama t, mereka bukan objek yang sama"); }} S sama dengan t, mereka adalah objek yang samaA dan B keduanya adalah konstanta, dan nilainya diperbaiki, sehingga nilai S juga ditetapkan, yang ditentukan ketika kelas dikompilasi. Dengan kata lain: String S = A+B; setara dengan: string s = "ab"+"cd";
string akhir statis publik a; // string akhir statis apublik konstan b; // konstan bstatic {a = "ab"; B = "CD"; } public static void main (string [] args) {// menginisialisasi s dengan + string gabungan s = a + b; String t = "ABCD"; if (s == t) {System.out.println ("S sama dengan T, mereka adalah objek yang sama"); } else {System.out.println ("s tidak sama t, mereka bukan objek yang sama"); }} s tidak sama dengan t, mereka bukan objek yang samaMeskipun A dan B didefinisikan sebagai konstanta, tak satu pun dari mereka ditugaskan segera. Sebelum menghitung nilai S, ketika mereka ditetapkan dan nilai apa yang ditugaskan adalah variabel. Oleh karena itu, sebelum A dan B ditugaskan, propertinya mirip dengan variabel. Maka S tidak dapat ditentukan selama periode kompilasi, tetapi hanya dapat dibuat saat runtime.
3.strings1 = newstring ("xyz"); Berapa banyak objek yang telah dibuat?
Pertimbangkan fase pemuatan kelas dan eksekusi aktual.
(1) Pemuatan kelas hanya akan dilakukan sekali di kelas. "XYZ" dibuat dan tinggal ketika kelas dimuat (jika string "xyz" telah ditinggali sebelum kelas dimuat, tidak perlu berulang kali membuat instance "xyz" untuk tinggal). String yang ditempatkan ditempatkan di kumpulan konstan string bersama global.
(2) Ketika kode ini selanjutnya dijalankan, instance string yang sesuai dengan literal "XYZ" diperbaiki dan tidak akan dibuat berulang kali. Jadi kode ini menyalin salinan objek di kolam konstan dan memasukkannya ke dalam tumpukan, dan menyerahkan referensi ke objek di tumpukan ke S1 untuk dipegang.
Pernyataan ini membuat 2 objek.
4.java.lang.string.intern ()
Fitur penting lain dari kumpulan konstan runtime dibandingkan dengan kumpulan konstanta file kelas adalah dinamisitasnya. Bahasa Java tidak memerlukan konstanta untuk dihasilkan hanya selama periode kompilasi, yaitu, isi kumpulan konstan dalam file kelas dapat memasuki area metode. Konstanta baru juga dapat ditempatkan ke kolam selama runtime. Fitur ini lebih umum digunakan oleh pengembang. Metode intern () dari kelas string.
Metode string magang () akan mencari tahu apakah ada string yang sama sama di kumpulan konstan. Jika ada, itu akan mengembalikan referensi ke string. Jika tidak ada, itu akan menambahkan string sendiri ke kumpulan konstan.
public static void main (string [] args) {string s1 = string baru ("komputer"); String s2 = s1.intern (); String s3 = "komputer"; System.out.println ("S1 == S2?" + (S1 == S2)); System.out.println ("S3 == S2?" + (S3 == S2));}S1 == S2? falsaes3 == S2? BENAR
Meringkaskan
Di atas adalah semua tentang menjelajahi java konstanta secara mendalam. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya.