Menu
Coddy logo textTech

equals() ve hashCode()

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 42 / 87.

Java'da nesneleri karşılaştırırken, == operatörü iki referansın aynı bellek konumunu gösterip göstermediğini kontrol eder. Nesnelerin gerçek içeriğini karşılaştırmak için equals() metodunu geçersiz kılmanız (override etmeniz) gerekir.

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);
    }
}

equals() yöntemi standart bir kalıbı takip eder: önce aynı nesne olup olmadığını kontrol edin, ardından türü doğrulayın ve son olarak ilgili alanları karşılaştırın.

equals() metodunu her geçersiz kıldığınızda (override), hashCode() metodunu da geçersiz kılmalısınız. Bu Java'da bir sözleşmedir: eşit olan nesneler aynı hash koduna sahip olmalıdır. HashMap ve HashSet gibi hash tabanlı koleksiyonlar, doğru çalışmak için bu kurala dayanır.

@Override
public int hashCode() {
    return Objects.hash(name, age);
}

Objects.hash() yardımcı yöntemi, equals() yönteminde kullanılan alanların aynısından bir karma kod (hash code) oluşturur. Eğer iki Person nesnesi aynı name ve age değerlerine sahipse, eşit kabul edilecekler ve özdeş karma kodlar üreterek koleksiyonlarda tutarlı bir davranış sergileyeceklerdir.

challenge icon

Görev

Kolay

Nesne eşitliğini düzgün bir şekilde uygulayan bir öğrenci kayıt sistemi oluşturalım. İki öğrencinin, bellekte aynı nesne olup olmadıklarına bakılmaksızın, aynı öğrenci kimliğine ve ismine sahip olmaları durumunda eşit kabul edildiği bir Student sınıfı oluşturacaksınız.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • Student.java: Üç özel (private) alana sahip bir öğrenciyi temsil eden bir sınıf oluşturun: studentId (String), name (String) ve gpa (double). Tüm alanları başlatan bir yapıcı (constructor) ve her alan için alıcı (getter) metotları ekleyin.

    equals() metodunu, iki Student nesnesinin aynı studentId VE aynı name değerine sahip olduklarında eşit kabul edilecek şekilde geçersiz kılın (override). Standart kalıbı izleyin: aynı referans olup olmadığını kontrol edin, null ve tür kontrolü yapın, ardından ilgili alanları karşılaştırın.

    hashCode() metodunu, equals() içinde kullanılan aynı alanlarla Objects.hash() kullanarak geçersiz kılın. Dosyanızın en üstüne java.util.Objects içe aktarmayı (import) unutmayın.

  • Main.java: Öğrenci nesnelerini karşılaştırarak Student sınıfınızı hayata geçirin. İki öğrenciyi temsil eden altı girdi alacaksınız: birinci öğrencinin kimliği, ismi ve GNO'su (GPA), ardından ikinci öğrencinin kimliği, ismi ve GNO'su.

    Her iki Student nesnesini de oluşturun, ardından üç karşılaştırma yapın ve sonuçları yazdırın:

    1. Same reference: yazdırın ve ardından birinci öğrencinin kendisine eşit olup olmadığını ekleyin (her zaman true olmalıdır)
    2. Content equality: yazdırın ve ardından birinci öğrencinin ikinci öğrenciye eşit olup olmadığını ekleyin (equals uygulamanıza bağlı olarak)
    3. Hash codes match: yazdırın ve ardından her iki öğrencinin aynı hash koduna sahip olup olmadığını ekleyin

Altı girdi alacaksınız: birinci öğrencinin kimliği (String), birinci öğrencinin ismi (String), birinci öğrencinin GNO'su (double), ikinci öğrencinin kimliği (String), ikinci öğrencinin ismi (String) ve ikinci öğrencinin GNO'su (double).

İki öğrencinin eşleşen kimlikleri ve isimleri olduğunda, hem equals() metodunun true döndürdüğüne HEM DE hash kodlarının eşleştiğine dikkat edin—bu, sürdürmeniz gereken sözleşmedir!

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // İlk öğrencinin verilerini oku
        String id1 = scanner.nextLine();
        String name1 = scanner.nextLine();
        double gpa1 = scanner.nextDouble();
        scanner.nextLine(); // yeni satırı tüket
        
        // İkinci öğrencinin verilerini oku
        String id2 = scanner.nextLine();
        String name2 = scanner.nextLine();
        double gpa2 = scanner.nextDouble();
        
        // TODO: Giriş verilerini kullanarak iki Student nesnesi oluşturun
        
        // TODO: "Same reference: " yazdırın ve ardından student1'in kendisine eşit olup olmadığını ekleyin
        
        // TODO: "Content equality: " yazdırın ve ardından student1'in student2'ye eşit olup olmadığını ekleyin
        
        // TODO: "Hash codes match: " yazdırın ve ardından her iki öğrencinin aynı hash koduna sahip olup olmadığını ekleyin
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler