Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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), dan gpa (double). Sertakan constructor untuk menginisialisasi semua field dan method getter untuk setiap field.

    Override method equals() agar dua object Student dianggap setara jika memiliki studentId yang sama DAN name yang sama. Ikuti pola standar: periksa apakah referensinya sama, periksa null dan tipe, lalu bandingkan field yang relevan.

    Override method hashCode() menggunakan Objects.hash() dengan field yang sama seperti yang digunakan dalam equals(). Ingat untuk mengimpor java.util.Objects di 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:

    1. Cetak Same reference: diikuti dengan apakah siswa pertama sama dengan dirinya sendiri (seharusnya selalu true)
    2. Cetak Content equality: diikuti dengan apakah siswa pertama sama dengan siswa kedua (berdasarkan implementasi equals-mu)
    3. Cetak Hash codes match: diikuti dengan apakah kedua siswa memiliki hash code yang sama

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
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Java online