Tipe data di Java dapat dibagi menjadi dua kategori:
1. Tipe data dasar disebut juga tipe data primitif. Untuk membandingkan byte, short, char, int, long, float, double, boolean, gunakan tanda sama dengan ganda (==), dan bandingkan nilainya.
2. Tipe data gabungan (kelas) Ketika dibandingkan menggunakan (==), mereka dibandingkan dengan alamat penyimpanannya di memori. Oleh karena itu, kecuali mereka adalah objek baru yang sama, hasil perbandingannya adalah benar, jika tidak maka perbandingannya hasilnya salah. Semua kelas di JAVA mewarisi dari kelas dasar Object. Kelas dasar di Object mendefinisikan metode yang sama. Perilaku awal metode ini adalah membandingkan alamat memori objek. Namun, di beberapa perpustakaan kelas, metode ini Ditimpa, seperti String , Integer, dan Date, equal memiliki implementasinya sendiri di kelas-kelas ini, alih-alih membandingkan alamat penyimpanan kelas di memori heap. Untuk perbandingan yang sama antar tipe data komposit, tanpa mengesampingkan metode sama dengan, perbandingan antara keduanya tetap berdasarkan nilai alamat lokasi penyimpanannya di memori, karena metode sama dengan Object juga menggunakan tanda sama dengan ganda ( ==) yang dibandingkan , jadi hasil perbandingannya sama dengan hasil tanda sama dengan ganda (==).
Copy kode kodenya sebagai berikut:
kelas publik TestString {
publicstaticvoid main(String[] args) {
String s1="Senin";
String s2="Senin";
jika (s1 == s2)
{
Sistem.keluar.println("s1 == s2");}
kalau tidak{
Sistem.keluar.println("s1 != s2");}
}
}
Kompilasi dan jalankan program, keluaran: s1 == s2 Catatan: s1 dan s2 mengacu pada objek String yang sama - "Senin"! 2. Jika Anda mengubah program sedikit, Anda akan menemukan sesuatu yang lebih aneh:
Copy kode kodenya sebagai berikut:
kelas publik TestString {
publicstaticvoid main(String[] args)
{
String s1="Senin";
String s2 =String baru("Senin");
if (s1 == s2) {Sistem.keluar.println("s1 == s2");
}
kalau tidak
{
Sistem.keluar.println("s1 != s2");
}
jika (s1.sama dengan(s2))
{
System.out.println("s1 sama dengan s2");
}
kalau tidak
{
System.out.println("s1 tidak sama dengan s2");
}
}
}
Kita menggunakan operator baru untuk membuat keluaran program untuk s2: s1 != s2 s1 sama dengan s2 Catatan: s1 dan s2 mengacu pada dua objek String "Senin" masing-masing.
3. String buffer pool Ternyata program akan membuat string buffer pool saat dijalankan. Saat menggunakan ekspresi seperti s2 = "Monday" untuk membuat string, program akan mencari nilai yang sama di String terlebih dahulu. buffer pool.Objek, pada program pertama, s1 pertama kali dimasukkan ke dalam pool, jadi ketika s2 dibuat, program menemukan s1 dengan nilai yang sama dan mereferensikan s2 ke objek "Senin" yang direferensikan oleh s1. Dengan menggunakan operator baru, dia dengan jelas memberi tahu program tersebut: "Saya ingin yang baru! Bukan yang lama!" Jadi objek Sting "Senin" baru dibuat di memori. Nilainya sama, namun lokasinya berbeda, yang satu berenang di kolam dan yang lain beristirahat di tepian pantai. Ups, sungguh membuang-buang sumber daya. Mengapa kita harus memisahkannya padahal jelas-jelas sama?
4. Ubah lagi programnya:
Copy kode kodenya sebagai berikut:
TestString kelas publik
{
publicstaticvoid main(String[] args)
{
String s1="Senin";
String s2 =String baru("Senin");
s2 = s2.magang();
jika (s1 == s2)
{
Sistem.keluar.println("s1 == s2");
}
kalau tidak
{
Sistem.keluar.println("s1 != s2");
}
jika (s1.sama dengan(s2))
{
System.out.println("s1 sama dengan s2");
}
kalau tidak
{
System.out.println("s1 tidak sama dengan s2");
}
}
}
Kali ini ditambahkan: s2 = s2.intern(); Output program: s1 == s2 s1 sama dengan s2 Ternyata nilai kembalian metode (java.lang.String intern() "abc".intern() masih berupa string " abc", di permukaan tampaknya metode ini tidak ada gunanya. Namun sebenarnya, ini melakukan trik kecil: periksa apakah ada string seperti "abc" di kumpulan string, dan jika ada, kembalikan string tersebut. string di kumpulan string; jika tidak ada, metode ini akan menambahkan "abc" ke kumpulan string dan kemudian mengembalikan referensinya).