![translation](https://cdn.durumis.com/common/trans.png)
Bu, AI tarafından çevrilen bir gönderidir.
Dil Seç
Text summarized by durumis AI
- equals(), nesnenin içeriğinin aynı olup olmadığını karşılaştırmak için kullanılan bir yöntemdir, hashCode() ise nesnenin benzersiz bir tamsayı değerini döndüren bir yöntemdir ve her ikisi de nesneleri karşılaştırmak için kullanılır.
- Hash veri yapılarında, hashCode() anahtarları belirlemek için kullanıldığından, aynı hash kodunu sağlamak için equals() ve hashCode() birlikte yeniden tanımlanmalıdır.
- equals() ve hashCode() birlikte kullanıldığında, hash veri yapılarında aynı nesneleri verimli bir şekilde yönetebilirsiniz.
equals()
equals(), nesnelerin içeriğinin aynı olup olmadığını karşılaştırır. Genellikle eşitlik karşılaştırması olarak adlandırılır ve equals() yeniden tanımlanmazsa, içsel olarak == ile aynı olduğundan aynılık karşılaştırması olur. Bu nedenle, nesneleri doğru şekilde eşitlik karşılaştırması yapmak istiyorsanız, mutlaka equals() kullanmalısınız.
public boolean equals(Object obj) {
return (this == obj);
hashCode()
hashCode(), iki nesnenin aynı nesne olup olmadığını kontrol eder. == ile aynı olan aynılık karşılaştırması işlevine sahiptir, ancak hashCode() yöntemi, dönüş değeri olarak çalıştırma zamanında nesnenin benzersiz bir tamsayı değerini döndürür. Genellikle yığın üzerinde depolanan nesnenin bellek adresini döndürür.
Bu yöntem, yerel anahtar kelimeyle işaretlenmiştir; bu, Java dışındaki bir dilde geliştirilmiş bir dilin Java'da kullanılabilmesi durumunda kullanılan bir anahtar kelimedir.
Karma nedir?
Karma, karma işlevi kullanarak değişken boyutlu bir giriş değerinden sabit boyutlu bir çıktı değeri oluşturma işlemini ifade eder. Karma işlemiyle elde edilen değere karma kodu denir.
equals() ve hashCode()
Aynı nesne, aynı bellek adresine sahip olmalıdır; bu nedenle aynı nesnenin aynı karma koda sahip olması gerektiği açıktır. Bu nedenle, equals() yerine hashCode() da yeniden tanımlanarak aynı karma kodunun garanti edilmesi için kodu yazmak daha iyidir.
Karma veri yapısı
public class Main {
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("제이온", 23));
people.add(new Person("제이온", 23));
System.out.println(people.size()); // 2
}
}
class Person {
private final String name;
private final 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;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
Yukarıdaki gibi HashSet veri yapısına aynı iki nesneyi ekleyelim. Bu Set'in boyutunu yazdırırsak 2 olacaktır. Neden?
Çünkü karma kullanılan veri yapısı, Key'i belirlerken hashCode() kullanır. Yani nesnelerin aynı olup olmadığını karşılaştırmadan önce, iki nesnenin karma kodlarının aynı olup olmadığını karşılaştırır ve daha sonra iki nesnenin eşit olup olmadığına karar verir. Bu durumda, hashCode() yeniden tanımlanmamışsa, Object'in hashCode() kullanılır, bu nedenle her nesnenin depolandığı bellek adresi döndürülür. Bu nedenle, karma veri yapılarını kullanırken, equals() dışında hashCode() da yeniden tanımlamak daha iyidir.
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("제이온", 23));
people.add(new Person("제이온", 23));
System.out.println(people.size()); // 1
}
}
class Person {
private final String name;
private final 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;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
Kaynak
Beklenen mülakat soruları ve cevapları
equals() ve hashCode() neden birlikte kullanılır?
Karma kullanılan veri yapısı, Key'i belirlerken hashCode() kullanır. Yani nesnelerin aynı olup olmadığını karşılaştırmadan önce, iki nesnenin karma kodlarının aynı olup olmadığını karşılaştırır ve daha sonra iki nesnenin eşit olup olmadığına karar verir. Bu durumda, hashCode() yeniden tanımlanmamışsa, Object'in hashCode() kullanılır, bu nedenle her nesnenin depolandığı bellek adresi döndürülür. Bu nedenle, karma veri yapılarını kullanırken, equals() dışında hashCode() da yeniden tanımlamak daha iyidir.