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() yöntemini geçersiz kılmanız 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ı izler: önce bunun aynı nesne olup olmadığını kontrol eder, ardından türü doğrular ve son olarak ilgili alanları karşılaştırır.

equals() metodunu her geçersiz kıldığında hashCode() metodunu da geçersiz kılmalısın. 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 şekilde çalışmak için bu kurala güvenir.

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

Objects.hash() yardımcı yöntemi, equals() içinde kullanılan alanların aynılarından bir karma kodu oluşturur. İki Person nesnesi aynı ada ve yaşa sahipse eşit kabul edilir ve koleksiyonlarda tutarlı davranışı garanti ederek aynı karma kodlarını üretir.

challenge icon

Görev

Kolay

Nesne eşitliğini doğru ş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 ID'sine ve ada sahiplerse eşit kabul edildiği bir Student sınıfı oluşturacaksın.

Kodunu iki dosya arasında düzenleyeceksin:

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

    İki Student nesnesinin aynı studentId VE aynı name değerine sahip olduklarında eşit kabul edilmesi için equals() metodunu override et. Standart kalıbı izle: aynı referansı kontrol et, null ve tür kontrolü yap, ardından ilgili alanları karşılaştır.

    equals() içinde kullanılan alanların aynısını kullanarak Objects.hash() ile hashCode() metodunu override et. Dosyanın en üstüne java.util.Objects import etmeyi unutma.

  • Main.java: Öğrenci nesnelerini karşılaştırarak Student sınıfını çalışır hâle getir. İki öğrenciyi temsil eden altı girdi alacaksın: ilk öğrencinin ID'si, adı ve GPA'si, ardından ikinci öğrencinin ID'si, adı ve GPA'si.

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

    1. Same reference: yazdır ve ardından ilk öğrencinin kendisine eşit olup olmadığını belirt (her zaman true olmalıdır)
    2. Content equality: yazdır ve ardından ilk öğrencinin ikinci öğrenciye eşit olup olmadığını belirt (equals uygulamana göre)
    3. Hash codes match: yazdır ve ardından her iki öğrencinin aynı hash koduna sahip olup olmadığını belirt

Altı girdi alacaksın: ilk öğrencinin ID'si (String), ilk öğrencinin adı (String), ilk öğrencinin GPA'si (double), ikinci öğrencinin ID'si (String), ikinci öğrencinin adı (String) ve ikinci öğrencinin GPA'si (double).

İki öğrenci aynı ID ve ada sahip olduğunda hem equals() metodunun true döndürdüğüne HEM DE hash kodlarının eşleştiğine dikkat et. Sürdürmen gereken sözleşme budur!

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ştur
        
        // TODO: Print "Same reference: " followed by whether student1 equals itself
        
        // TODO: Print "Content equality: " followed by whether student1 equals student2
        
        // TODO: Print "Hash codes match: " followed by whether both students have the same hash code
    }
}
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

Kendi başına pratik yap: Online Java derleyicisi