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 başvurunun 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 düzeni izler: önce 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 geçersiz kıldığınızda hashCode() metodunu da geçersiz kılmalısınız. Bu, Java'da bir sözleşmedir: eşit olan nesnelerin aynı karma koduna sahip olması gerekir. HashMap ve HashSet gibi karma 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ı metodu, equals() içinde kullanılan aynı alanlardan bir karma kodu oluşturur. İki Person nesnesi aynı ada ve yaşa sahipse eşit kabul edilir ve koleksiyonlarda tutarlı davranışı garantileyerek aynı karma kodlarını üretir.
Görev
KolayNesne eşitliğini doğru şekilde uygulayan bir öğrenci kayıt sistemi oluşturalım. Bellekte aynı nesne olup olmadıklarına bakılmaksızın, aynı öğrenci kimliğine ve ada sahip iki öğrencinin eşit kabul edildiği bir Student sınıfı oluşturacaksın.
Kodunu iki dosyaya ayıracaksın:
Student.java: Bir öğrenciyi temsil eden, üç özel alanı olan bir sınıf oluştur:studentId(String),name(String) vegpa(double). Tüm alanları başlatan bir kurucu 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 geçersiz kıl. Standart düzeni izle: aynı referans olup olmadığını 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ıObjects.hash()ile kullanarakhashCode()metodunu geçersiz kıl. Dosyanın en üstünejava.util.Objectsiçe aktarmayı 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 kimliği, adı ve GPA'sı, ardından ikinci öğrencinin kimliği, adı ve GPA'sı.İki 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 (equalsuygulamana göre)Hash codes match:yazdır ve ardından her iki öğrencinin de aynı hash koduna sahip olup olmadığını belirt
Altı girdi alacaksın: ilk öğrencinin kimliği (String), ilk öğrencinin adı (String), ilk öğrencinin GPA'sı (double), ikinci öğrencinin kimliği (String), ikinci öğrencinin adı (String) ve ikinci öğrencinin GPA'sı (double).
İki öğrencinin kimlikleri ve adları eşleştiğinde hem equals() metodunun true döndürdüğüne HEM DE hash kodlarının eşleştiğine dikkat et. Koruman 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(); // satır sonu karakterini tüket
// İkinci öğrencinin verilerini oku
String id2 = scanner.nextLine();
String name2 = scanner.nextLine();
double gpa2 = scanner.nextDouble();
// TODO: Girdi verilerini kullanarak iki Student nesnesi oluştur
// TODO: "Same reference: " yazdır, ardından student1'in kendisine eşit olup olmadığını yazdır
// TODO: "Content equality: " yazdır, ardından student1'in student2'ye eşit olup olmadığını yazdır
// TODO: "Hash codes match: " yazdır, ardından iki öğrencinin hash kodlarının aynı olup olmadığını yazdır
}
}
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