Kuasai penggunaan yang sama melalui contoh berikut
package cn.galc.test;public class TestEquals { public static void main(String[] args) { /** * Di sini, metode konstruksi Cat() digunakan untuk membuat dua kucing baru di memori heap * Dua kucing adalah Warna, berat, dan tinggi badan semuanya sama, * tetapi c1 dan c2 tidak akan pernah sama. Hal ini karena c1 dan c2 adalah objek referensi dari dua kucing di memori heap, * Ini berisi alamat di mana dua kucing dapat ditemukan, tetapi karena kedua kucing disimpan di dua ruang berbeda di memori heap, *c1 dan c2 berisi alamat berbeda, jadi c1 dan c2 tidak akan pernah sama. */ Cat c1 = new Cat(1, 1, 1); Cat c2 = new Cat(1, 1, 1); System.out.println("Hasil dari c1==c2 adalah: "+(c1== c2 ));//false System.out.println("Hasil dari c1.equals(c2) adalah: "+c1.equals(c2));//false }}class Cat { int warna, berat, tinggi; kucing publik(int warna, int berat, int tinggi) { ini.warna = warna; ini.berat = berat; ini.tinggi = tinggi }}Gambarlah diagram analisis memori untuk menganalisis hasil perbandingan antara c1 dan c2
program:
Kucing c1 = Kucing baru(1,1,1);Kucing c2 = Kucing baru(1,1,1);
Setelah dieksekusi, tata letak di memori adalah seperti yang ditunjukkan di bawah ini:
c1 menunjuk ke suatu objek, dan c2 juga menunjuk ke suatu objek. C1 dan c2 berisi alamat yang disimpan dalam memori tumpukan kedua objek Cat ini karena kedua objek Cat terletak di ruang penyimpanan yang berbeda, c1 dan c2 berisi alamat pasti tidak sama, jadi kedua objek acuan c1 dan c2 pasti tidak sama. Oleh karena itu, jika Anda menjalankan: "System.out.println(c1==c2);" hasil cetakannya pasti salah. Jadi Anda membuat dua objek dengan yang baru. Jangan khawatir, referensi kedua objek tersebut tidak akan pernah sama. Jika keduanya sama, salah satunya akan tertimpa. Apakah c1 sama dengan c2 membandingkan isi yang terdapat pada kedua referensi c1 dan c2, karena referensi kedua objek yang dihasilkan baru tidak pernah sama, sehingga isi kedua referensi c1 dan c2 juga tidak pernah sama c1 tidak akan pernah bisa sama dengan c2. Oleh karena itu, membandingkan referensi dua objek tidak akan pernah bisa membuat kedua objek tersebut sama atau identik.
Untuk menentukan apakah dua objek sama, Anda tidak dapat membandingkan apakah referensi kedua objek tersebut sama. Anda tidak akan pernah mendapatkan hasil yang sama karena referensi kedua objek tidak akan pernah sama, jadi cara perbandingan yang benar adalah dengan membandingkannya secara langsung. dua benda dan bandingkan apakah hakikat kedua benda tersebut sama, yaitu apakah isi kedua benda tersebut sama. Tentukan apakah kedua benda tersebut sama dengan membandingkan apakah nilai atribut kedua benda tersebut sama.
Kelas Object menyediakan metode sama dengan() untuk membandingkan apakah isi dari dua objek sama, sehingga kita dapat menggunakan metode ini untuk membandingkan apakah kedua objek tersebut secara logika "sama". Misalnya: c1.equals(c2); Berikut ini adalah pemanggilan metode sama dengan() yang diwarisi dari kelas Object. Dengan melihat dokumentasi API, definisi metode sama dengan di kelas Object adalah sebagai berikut:
boolean publik sama dengan(Obj objek)
Implementasi default dari metode Equals() yang disediakan di kelas Object adalah membandingkan referensi objek saat ini dan referensi yang ingin Anda bandingkan untuk melihat apakah keduanya menunjuk ke objek yang sama, yaitu sama dengan "c1==c2 ". , "c1.equals(c2)" dan "c1==c2" sepenuhnya setara. Oleh karena itu, menggunakan metode sama dengan() yang diwarisi secara langsung tidak dapat secara langsung membandingkan apakah konten dua objek sama. Oleh karena itu, kita harus mengganti metode sama dengan() dan mengubah implementasi default metode ini.
Selanjutnya, tulis ulang metode yang diwarisi sama dengan() di kelas Cat:
class Cat { int warna, berat, tinggi; public Cat(int warna, int berat, int tinggi) { this.color = warna; this.weight = berat; this.height = tinggi; Metode equal() yang diwarisi dari kelas Object mengubah implementasi default metode ini. * Gunakan implementasi yang kami tentukan sendiri untuk menentukan apakah dua objek sama secara logis. *Di sini kita definisikan bahwa jika warna, berat, dan tinggi dua kucing sama, * maka kita mengira kedua kucing tersebut secara logika identik, artinya kedua kucing tersebut “sama”. */ public boolean sama dengan(Obj objek){ if (obj==null){ return false; } else{ /** * instanceof adalah operator objek. * Operator objek digunakan untuk menentukan apakah suatu objek termasuk dalam instance kelas tertentu atau subkelas tertentu. * Operator objek adalah gabungan kata instanceof. * Operator ini adalah operator biner. Ekspresi di sebelah kiri adalah objek dan ekspresi di sebelah kanan adalah kelas * Jika objek di sebelah kiri adalah objek yang dibuat oleh kelas di sebelah kanan, maka hasil operasinya adalah benar, jika tidak maka salah. */ if (obj instanceof Cat){ Cat c = (Cat)obj; if (c.color==this.color && c.weight==this.weight && c.height==this.height){ kembalikan benar; } } } mengembalikan salah; Saat ini, jalankan perintah pencetakan dalam metode utama:
public static void main(String[] args) { /** * Di sini, metode konstruksi Cat() digunakan untuk membuat dua kucing baru di memori heap * Warna, berat, dan tinggi kedua kucing ini sama . * Tapi c1 dan c2 tidak akan pernah sama. Hal ini karena c1 dan c2 adalah objek referensi dari dua kucing di memori heap. * berisi alamat di mana kedua kucing tersebut dapat ditemukan, tetapi karena kedua kucing tersebut disimpan di tumpukan memori Di dua ruang berbeda, * Jadi c1 dan c2 mempunyai alamat yang berbeda, jadi c1 dan c2 tidak akan pernah sama. */ Cat c1 = new Cat(1, 1, 1); Cat c2 = new Cat(1, 1, 1); System.out.println("Hasil dari c1==c2 adalah: "+(c1== c2 ));//false System.out.println("Hasil dari c1.equals(c2) adalah: "+c1.equals(c2));//true }Hasil yang diperoleh kali ini berbeda dengan hasil yang diperoleh terakhir kali tanpa mengesampingkan metode sama dengan():
"System.out.println(c1 == c2);" Hasil print tetap salah, karena isi referensi kedua objek dibandingkan sama, jadi hasil cetakannya pasti salah.
"System.out.println(c1.equals(c2));" Hasil cetakannya benar, karena kami telah menulis ulang metode sama dengan() di kelas Cat dan mengubah implementasi default metode ini caranya Ubah menjadi saja Jika kedua benda ini benar-benar ada dan sama-sama kucing, serta warna, tinggi dan beratnya sama, maka kedua kucing tersebut secara logika identik dan persis sama. Dua kucing, artinya kedua kucing ini "sama". Jadi hasil yang dicetak disini adalah benar.
Jadi bagaimana cara membandingkan dua objek string untuk kesetaraan?
Lihatlah contoh berikut:
public class TestEquals { public static void main(String args[]){ String s1 = new String("hello"); String s2 = new String("hello"); : "+(s1 == s2));//salah System.out.println("Hasil dari s1.equals(s2) adalah: "+s1.equals(s2));//true }}Kali ini kedua objek string dibandingkan untuk kesetaraan:
Sistem.keluar.println(s1 == s2);
Hasil cetakannya masih salah, karena disini referensi kedua objek string s1 dan s2 dibandingkan. Referensi kedua objek tersebut tidak akan pernah sama, sehingga hasil cetakannya salah.
System.out.println(s1.sama dengan(s2));
Hasil cetakannya benar, karena pewarisan dari kelas Object ditulis ulang di kelas String (semua kelas diwarisi dari kelas Object, dan tentu saja kelas String tidak terkecuali. Jika Anda mewarisi dari kelas induk, Anda memiliki segalanya dari kelas induk. Atribut dan metode, sehingga kelas Sting juga memiliki metode sama dengan(), dan metode sama dengan() yang diwarisi juga telah ditulis ulang), mengubah implementasi default metode ini.
Di kelas String, implementasi metode sama dengan() ditimpa seperti ini: bandingkan objek string saat ini dengan objek string yang ditentukan. Objek string yang ditentukan tidak boleh kosong dan urutan karakter objek ini sama dengan string saat ini . Urutan string dari objek-objek tersebut adalah sama. Jika kondisi ini terpenuhi, maka kedua objek string tersebut adalah sama.
Oleh karena itu s2 disini sudah memenuhi syarat, sehingga hasil cetakannya benar.
Di masa depan, ketika membandingkan dua objek di kelas tertentu untuk kesetaraan, pertama-tama buka dokumentasi API untuk mengetahui apakah kelas ini telah mengganti metode sama dengan() yang diwarisi dari kelas Object. Jika metode sama dengan() ditimpa, maka metode sama dengan() yang ditimpa dipanggil saat membandingkan apakah dua objek sama. Jika tidak ditimpa, maka metode yang diwarisi dari kelas Object akan dipanggil secara langsung menggunakan implementasi default metode sama dengan() untuk membandingkan apakah dua objek sama. Oleh karena itu, setiap kelas dapat mengganti metode sama dengan() yang diwarisi dari kelas Object sesuai kebutuhan.
Untuk mencari kelas tertentu pada dokumen API, jika suatu kelas dapat digunakan secara langsung tanpa memperkenalkan paket, maka kelas tersebut harus ada dalam paket java.lang. Misalnya kelas String di sini dapat digunakan secara langsung, jadi kelas String harus Itu ada dalam paket java.lang. Saat menggunakan kelas tertentu, periksa paket mana yang diimpor kelas tersebut, lalu buka paket tersebut untuk menemukan kelasnya. Kelas yang tidak perlu mengimpor paket harus berlokasi di java.lang. Langsung saja ke java.lang untuk menemukannya .
Secara umum, saat kita mendesain sebuah kelas, kita perlu mengganti metode sama dengan kelas induknya. Saat menulis ulang metode ini, kita perlu mendesainnya sesuai dengan aturan berikut:
1. Refleksivitas: Untuk setiap nilai referensi X, nilai kembalian x.equals(x) harus benar.
2. Simetri: Untuk nilai referensi apa pun x, y, jika dan hanya jika nilai kembalian y.equals(x) benar, nilai kembalian x.equals(y) harus benar;
3. Transitivitas: Jika x.sama dengan(y)=benar, y.sama dengan(z)=benar, maka x.sama dengan(z)=benar
4. Konsistensi: Jika objek yang dibandingkan tidak berubah, maka hasil perbandingan objek juga tidak berubah.
5. Non-nullability: Untuk setiap nilai referensi non-null X, nilai kembalian x.equals(null) harus salah
Misalnya:
kelas publik Orang { String pribadi Nama Depan; String pribadi Nama Belakang; String publik getNama Depan() { kembalikan Nama Depan } public void setNama Depan(String Nama Depan) { ini.Nama Depan = Nama Depan; } public void setLastName(String lastName) { this.lastName = lastName; } public int getAge() { kembalikan usia; } public void setAge(int age) { this.age = age; } @Override public boolean sama dengan(Objek obj) { jika (ini == obj) mengembalikan nilai true; jika (obj == null) mengembalikan false jika (getClass() != obj.getClass()) return false; Orang lain = (Orang) obj; if (usia != other.age) return false; if (firstName == null) { if (other.firstName != null) return false; (!firstName.equals(other.firstName)) mengembalikan false; } else if (!lastName.equals(other.lastName)) mengembalikan false; ;
Dalam contoh ini, kita menetapkan bahwa seseorang adalah orang yang sama jika nama belakangnya, nama depan dan umurnya sama. Tentu saja Anda juga dapat menambahkan atribut lainnya. Misalnya, nomor ID harus sama untuk dinilai sebagai orang yang sama. Kemudian Anda dapat menambahkan penilaian nomor ID dengan metode yang sama!
Ringkasan: Untuk membandingkan apakah dua objek sama, kita menggunakan metode sama dengan(). Kondisi untuk menilai apakah dua objek sama ditentukan oleh kita setelah menulis ulang implementasi metode sama dengan(), sehingga metode sama dengan() bisa dapat digunakan dengan lebih fleksibel. Bandingkan dua objek dari kelas yang sama di kelas yang berbeda untuk melihat apakah keduanya sama.