30 Kasım 2019 Cumartesi

Java - equals() ve hashCode() Methodları

Bu yazimda equals() ve hashCode() methodlarinin ne ise yaradigini gorecegiz. Oncelikle asagidaki ornek uzerinden gidelim.

import java.util.HashMap;
import java.util.Map;
public class Example {
 public static void main(String[] args) {
  Person p1 = new Person(1);
  Person p2 = new Person(1);

  Map<Person, String> pMap = new HashMap<Person, String>();
  pMap.put(p1, "Jon");
  pMap.put(p2, "Jon");
  
  System.out.println(pMap.size());
  
  Integer i1 = new Integer(1);
  Integer i2 = new Integer(1);
  Map<Integer, String> iMap = new HashMap<Integer, String>();
  
  iMap.put(i1, "1");
  iMap.put(i2, "1");
  
  System.out.println(iMap.size());
 }
}

class Person{
 int id;
 
 public Person(int id) {
  this.id = id;
 }
}

Ornegimizi aciklamaya calisalim. Person adinda id si olan bir classimiz var. Ve ben main classimda bir ayni id li iki ayri Person objesi olusturuyorum ve bunlari map e ekliyorum, soru ise map in size i nedir.

Ayni seyi Integer icin de yapiyoruz. Ayni degerli iki ayri integer objesi olusturuyoruz ve bir map olusturup bu iki integer i ekliyoruz. Ikisi de ayni degeri iceriyor. Ayni sekilde size i print ettiryoruz.

Sonucun ne olmasini bekleriz.

Output:
2
1

Yani person Map te ayni degeri icermesine ragmen size 2 dondu ama integer map te ayni degeri icerdigi icin 1 dondu. Bu nasil oldu.


Aciklama

Integer bir Wrapper class ve icerisinde hashCode ve equals metodlari tanimli olarak geliyor. O yuzden hashCode ve equals methodlari calistigi icin ayni degeri yeniden eklememize izin vermedi.

Ama Person classini biz yazdik ve icinde hashCode ve equals methodlari yok. Bu yuzden de bir kontrol yapmadi ve ayni degerleri ekleyebildik. Olmasi gereken once hashCode degerleri esit mi diye bakacak esitse equals methodu ile contentleri esit mi diye bakacak.

O yuzden Person classina hashCode() ve equals() methodlarini ekleyelim. Istersek kendimiz yazabiliriz istersek IDE den implement edebiliriz.

package com.examples;

import java.util.HashMap;
import java.util.Map;

public class Example {

 public static void main(String[] args) {
  Person p1 = new Person(1);
  Person p2 = new Person(1);
  
  Map pMap = new HashMap();
  pMap.put(p1, "Jon");
  pMap.put(p2, "Jon");
  
  System.out.println(pMap.size());
  
  Integer i1 = new Integer(1);
  Integer i2 = new Integer(1);
  Map iMap = new HashMap();
  
  iMap.put(i1, "1");
  iMap.put(i2, "1");
  
  System.out.println(iMap.size());
 }
}

class Person{
 int id;
 
 public Person(int id) {
  this.id = id;
 }
 @Override
 public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + id;
  return result;
 }
 @Override
 public boolean equals(Object obj) {
  if (this == obj)
   return true;
  if (obj == null)
   return false;
  if (getClass() != obj.getClass())
   return false;
  Person other = (Person) obj;
  if (id != other.id)
   return false;
  return true;
 } 
}

Bu durumda output ikisi icinde 1 olacak. hashCode ve equals methodlari sayesinde ayni degeri eklememize izin vermeyecek.



Hiç yorum yok:

Yorum Gönder