Java'da equals ve hashCode metodlarının sözleşmeleri hakkında bilgi ver.
sobes.tech yapay zeka
AI'dan gelen yanıt
-
Yansıma: herhangi bir sıfır olmayan referans değeri
xiçin,x.equals(x)truedöndürmelidir. -
Simetri: herhangi iki sıfır olmayan referans değeri
xveyiçin,x.equals(y)yalnızcay.equals(x)trueisetruedöndürmelidir. -
Transitiflik: herhangi üç sıfır olmayan referans değeri
x,yveziçin, eğerx.equals(y)truevey.equals(z)trueise,x.equals(z)detrueolmalıdır. -
Tutarlılık: herhangi iki sıfır olmayan referans değeri
xveyiçin,x.equals(y)çoklu çağrıları sürekli olaraktrueveyafalsedöndürmelidir, bu çağrılar arasındaequalskarşılaştırmalarında kullanılan bilgiler değişmediği sürece. -
Herhangi bir sıfır olmayan referans değeri
xiçin,x.equals(null)falsedöndürmelidir. -
Eğer iki nesne
equals(Object)yöntemiyle eşitse, her iki nesne içinhashCodeyöntemi çağrısı aynı tam sayı değerini vermelidir. -
İki nesne
equals(java.lang.Object)yöntemiyle eşit değilse,hashCodeyöntemi çağrısı ile her iki nesne için farklı tam sayı değerleri vermesi gerekmez. Ancak, programcı farklı olmayan nesneler için farklı hash kodları üretmenin hash tablolarının performansını artırabileceğini anlamalıdır.
Her iki yöntemi de equals ve hashCode yeniden tanımlamak önemlidir, eğer biri yeniden tanımlanmışsa, sözleşmeyi korumak için. equals kullanımı hashCode yeniden tanımlanmadan, hash kullanılarak yapılan koleksiyonların (örneğin, HashMap, HashSet) düzgün çalışmamasına neden olabilir.
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true; // Yansıma
if (o == null || getClass() != o.getClass()) return false; // null ve tip kontrolü
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name); // İçerik karşılaştırması
}
@Override
public int hashCode() {
return Objects.hash(name, age); // Alanlara göre hash üretimi
}
}