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.
Görev
KolayNesne 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) vegpa(double). Tüm alanları başlatan bir constructor ve her alan için getter metotları ekle.İki Student nesnesinin aynı
studentIdVE aynınamedeğerine sahip olduklarında eşit kabul edilmesi içinequals()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ı kullanarakObjects.hash()ilehashCode()metodunu override et. Dosyanın en üstünejava.util.Objectsimport 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:
Same reference:yazdır ve ardından ilk öğrencinin kendisine eşit olup olmadığını belirt (her zaman true olmalıdır)Content equality:yazdır ve ardından ilk öğrencinin ikinci öğrenciye eşit olup olmadığını belirt (equals uygulamana göre)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
}
}
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
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici KalıbıKendi başına pratik yap: Online Java derleyicisi