equals() dan hashCode()
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 42 dari 87.
Saat membandingkan object di Java, operator == memeriksa apakah dua referensi menunjuk ke lokasi memori yang sama. Untuk membandingkan konten sebenarnya dari object, kamu perlu menimpa method equals().
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && name.equals(person.name);
}
}method equals() mengikuti pola standar: pertama periksa apakah itu object yang sama, lalu verifikasi tipe datanya, dan terakhir bandingkan field yang relevan.
Setiap kali kamu menimpa equals(), kamu juga harus menimpa hashCode(). Ini adalah kontrak di Java: object yang sama harus memiliki kode hash yang sama. Koleksi berbasis hash seperti HashMap dan HashSet bergantung pada aturan ini agar berfungsi dengan benar.
@Override
public int hashCode() {
return Objects.hash(name, age);
}Method utilitas Objects.hash() menghasilkan kode hash dari field yang sama dengan yang digunakan dalam equals(). Jika dua object Person memiliki nama dan usia yang sama, keduanya akan dianggap sama dan menghasilkan kode hash yang identik, sehingga perilakunya konsisten dalam koleksi.
Tantangan
MudahMari buat sistem catatan siswa yang menerapkan kesetaraan object dengan benar. Kamu akan membuat class Student yang menganggap dua siswa setara jika memiliki ID siswa dan nama yang sama, terlepas dari apakah keduanya merupakan object yang sama di memori.
Kamu akan mengatur kodemu dalam dua file:
Student.java: Buat class yang merepresentasikan seorang siswa dengan tiga field private:studentId(String),name(String), dangpa(double). Sertakan constructor untuk menginisialisasi semua field dan method getter untuk setiap field.Override method
equals()agar dua object Student dianggap setara jika memilikistudentIdyang sama DANnameyang sama. Ikuti pola standar: periksa apakah referensinya sama, periksa null dan tipe, lalu bandingkan field yang relevan.Override method
hashCode()menggunakanObjects.hash()dengan field yang sama seperti yang digunakan dalamequals(). Ingat untuk mengimporjava.util.Objectsdi bagian atas filemu.Main.java: Hidupkan class Student-mu dengan membandingkan object siswa. Kamu akan menerima enam input yang mewakili dua siswa: ID, nama, dan GPA siswa pertama, lalu ID, nama, dan GPA siswa kedua.Buat kedua object Student, lalu lakukan tiga perbandingan dan cetak hasilnya:
- Cetak
Same reference:diikuti dengan apakah siswa pertama sama dengan dirinya sendiri (seharusnya selalu true) - Cetak
Content equality:diikuti dengan apakah siswa pertama sama dengan siswa kedua (berdasarkan implementasi equals-mu) - Cetak
Hash codes match:diikuti dengan apakah kedua siswa memiliki hash code yang sama
- Cetak
Kamu akan menerima enam input: ID siswa pertama (String), nama siswa pertama (String), GPA siswa pertama (double), ID siswa kedua (String), nama siswa kedua (String), dan GPA siswa kedua (double).
Perhatikan bahwa ketika dua siswa memiliki ID dan nama yang sama, equals() mengembalikan true DAN hash code keduanya cocok. Inilah kontrak yang harus kamu pertahankan!
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Baca data siswa pertama
String id1 = scanner.nextLine();
String name1 = scanner.nextLine();
double gpa1 = scanner.nextDouble();
scanner.nextLine(); // lewati karakter baris baru
// Baca data siswa kedua
String id2 = scanner.nextLine();
String name2 = scanner.nextLine();
double gpa2 = scanner.nextDouble();
// TODO: Buat dua object Student menggunakan data input
// TODO: Cetak "Same reference: ", lalu cetak apakah student1 sama dengan dirinya sendiri
// TODO: Cetak "Content equality: ", lalu cetak apakah student1 sama dengan student2
// TODO: Cetak "Hash codes match: ", lalu cetak apakah kedua siswa memiliki kode hash yang sama
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem PembayaranLatihan sendiri: Compiler Java online