Tes 1:
Mari kita lihat satu set perbandingan jenis string. Tanpa basa -basi lagi, cukup masukkan kode:
tes kelas publik {public static void main (string [] args) {string a = "java book garden"; String b = "Java Book Garden"; String c = string baru ("Java Book Garden"); String d = string baru ("Java Book Garden"). Intern (); if (a == b) {System.out.println ("a == b"); } else {System.out.println ("A! = B"); } if (a.equals (b)) {System.out.println ("A.Equals (b)"); } else {System.out.println ("! A.Equals (b)"); } if (a == c) {System.out.println ("a == c"); } else {System.out.println ("a! = c"); } if (a.equals (c)) {System.out.println ("A.Equals (c)"); } else {System.out.println ("! A.Equals (c)"); } if (a == d) {System.out.println ("a == d"); } else {System.out.println ("A! = D"); } if (a.equals (d)) {System.out.println ("a.equals (d)"); } else {System.out.println ("A.Equals (d)"); }}}Hasil output:
A == BA.Equals (B) A! = Ca.Equals (C) A == da.Equals (D)
Meringkaskan:
Hasil A == B: Saat program berjalan, itu akan membuat kumpulan buffer string. Ketika String A = "Java Book Garden", "Java Book Garden" ditempatkan di kolam penyangga string. Ketika string b = "Java Book Garden" membuat string, program ini pertama -tama akan mencari objek dengan nilai yang sama di kumpulan buffer string ini. Oleh karena itu, ketika B dibuat, program menemukan A dengan nilai yang sama dan referensi objek yang dirujuk oleh a. Oleh karena itu, a dan b merujuk ke objek yang sama, jadi a == b.
Akibatnya, A! = C: String C = String baru ("Java Book Garden") Baru objek baru, sehingga tidak dicari dari kumpulan buffer string, dan secara langsung membuat objek baru. Jadi A! = C.
Hasil A == D: Ketika metode magang dipanggil, jika kumpulan sudah berisi string yang sama dengan objek string ini (objek ditentukan oleh metode setara (objek)), string dalam kumpulan dikembalikan. Jika tidak, tambahkan objek string ini ke kumpulan dan mengembalikan referensi ke objek string ini. Semua D memanggil objek a.
sama dengan membandingkan nilai, jadi ketika nilainya sama, mereka sama.
Tes 2:
Berikut adalah tes dari satu set jenis int dan jenis integer:
tes kelas publik {public static void main (string [] args) {int a = 127; int a1 = 127; int b = 128; Integer C = 127; Integer C1 = 127; Integer D = 128; Integer D1 = 128; if (a == a1) {System.out.println ("a == a1"); } else {System.out.println ("A! = A1"); } if (b == b1) {System.out.println ("b == b1"); } else {System.out.println ("B! = B1"); } if (c == c1) {System.out.println ("c == c1"); } else {System.out.println ("C! = C1"); } if (d == d1) {System.out.println ("d == d1"); } else {system.out.println ("d! = d1"); }}}Hasil output:
A == A1B == B1C == C1D! = D1
Hasil "A == A1" dan "B == B1": int adalah tipe dasar, dan nilainya disimpan secara langsung, sedangkan integer adalah objek, dan menunjuk ke objek ini dengan referensi. Sebagian besar perbandingan terbuat dari "A == A1" dan "B == B1".
Hasil "C == C1" dan "D! = D1" mungkin memiliki pertanyaan di sini, mengapa "D! = D1". Mari kita lihat kode sumber Integer bersama -sama.
/** * cache untuk mendukung semantik identitas objek autoboxing untuk nilai antara * -128 dan 127 (inklusif) seperti yang dipersyaratkan oleh JLS. * * Cache diinisialisasi pada penggunaan pertama. Ukuran cache * dapat dikendalikan oleh -xx: autoboxcachemax = <Siece> opsi. * Selama inisialisasi VM, java.lang.integer.integercache.high properti * dapat ditetapkan dan disimpan dalam properti sistem pribadi di kelas * sun.misc.vm. */ Private Static Class Integercache {static final int low = -128; statis final int high; cache integer final statis []; static {// nilai tinggi dapat dikonfigurasi oleh properti int h = 127; String integercacheHighPropValue = sun.misc.vm.getsavedproperty ("java.lang.integer.integercache.high"); if (integercacheHighpropValue! = null) {int i = parseInt (integercacheHighpropValue); i = Math.max (i, 127); // Ukuran array maksimum adalah integer.max_value h = math.min (i, integer.max_value -(-low) -1); } tinggi = h; cache = bilangan bulat baru [(tinggi - rendah) + 1]; int j = rendah; untuk (int k = 0; k <cache.length; k ++) cache [k] = bilangan bulat baru (j ++); } private integercache () {}} /** * Mengembalikan {@code integer} instance yang mewakili nilai * {@code int} yang ditentukan. Jika instance {@code integer} baru tidak diperlukan *, metode ini umumnya harus digunakan dalam preferensi untuk * konstruktor {@link #integer (int)}, karena metode ini kemungkinan * menghasilkan ruang dan kinerja waktu yang lebih baik dengan * caching yang sering diminta nilai. * * Metode ini akan selalu cache nilai dalam kisaran -128 hingga 127, * inklusif, dan dapat menyimpan nilai -nilai lain di luar rentang ini. * * @param I an {@code int} nilai. * @return an {@code integer} instance mewakili {@code i}. * @Since 1.5 */ 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); }Kesimpulan: Di sini Integer akan menginisialisasi kumpulan konstan [-128.127]. Jika nilainya dalam kisaran ini, objek yang sama dirujuk. Jika tidak dalam kisaran ini, dapat dilihat dari kode sumber bahwa objek baru yang dikembalikan adalah: mengembalikan bilangan bulat baru (i);
Oleh karena itu, hasil "C == C1" mengacu pada objek yang sama, dan hasilnya "D! = D1" mengacu pada objek baru yang baru, jadi berbeda.