package kr.or.ddit.basic;
import java.util.HashSet;
import java.util.Set;
public class T07EqualsHashCodeTest {
/*
* 해시함수(hash function)는 임의의 길이의 데이터를 고정된 길이의 데이터를 매핑해주는 함수이다.
* 해시함수에 의해 얻어지는 값은 해시값, 해시코드 등으로 부른다.
*
* HashSet, HashMap,Hashtable과 같은 객체들을 사용할 경우
* 추가하는 객체가 서로 같은지를 비교하기 위해 equals()와 hasCode()사용한다.
* 그래서 객체가 서로 같은지 여부를 결정하려면 두 메서드를 적절하게 재정의 해주어야한다.
*
* equals는 Object 소속
* - equals() 는 두 객체의 내용(값)이 같은지 비교하는 메서드
* - hashCode() 는 객체에 대한 해시코드값을 반환하는 메서드이다 => 해시테이블 생성시 사용됨
*
* - equals() 메서드와 hashCode() 메서드 작성에 관련된 규칙(Convention)
* 1. 두 객체가 같으면 반드시 같은 hashCode를 가져야 한다.
* 2. 두 객체가 같으면 equals()를 호출했을 때 true 반환해야한다.
* 즉, 객체 a,b 같다면 a.equals(b)와 b.equlas(a) 둘다 true 이어야한다.
* 3. 두 객체의 hashCode()가 같다고 해서 두객체가 반드시 같은 객체는 아니다.
* 하지만, 두 객체가 같으면 반드시 hashCode()가 같아야한다.
* 4. equals()를 재정의해야 한다면 반드시 hashCode()도 재정의해주어야한다.
* 5. hashCode()는 기본적으로 Heap메모리에 있는 각 객체에 대한 메모리 주소값을 기반으로 한 정수 값을 반환한다.
* 그러므로 클래스에서 hashCode()메서드를 재정의 하지 않으면 절대로 두 객체가 같은 것으로 간주될 수 없다.
*/
public static void main(String[] args) {
String str1 = "홍길동";//객체 생성
String str2 = "홍길동";//객체 생성
//1.두 객체가 같으면 반드시 같은 hashCode를 가져야 한다.
//1.같은 객체라면 동일한 값이 나옴
System.out.println(str1.hashCode()); //54150062
System.out.println(str2.hashCode()); //54150062
//같은 이유 str1,str2 값이 같아서
// 2. 두 객체가 같으면 equals()를 호출했을 때 true 반환해야한다.
System.out.println(str1.equals(str1)); //true
//3. 두 객체의 hashCode()가 같다고 해서 두객체가 반드시 같은 객체는 아니다.
String str3 = "Aa";//객체 생성
String str4 = "BB";//객체 생성
System.out.println(str3.hashCode()); //2112
System.out.println(str4.hashCode()); //2112
Person p1 = new Person(1,"홍길동");
Person p2 = new Person(1,"홍길동");
Person p3 = new Person(1,"이순신");
//객체 비교할때는
// == 메모리 영역에서 비교
// equals 객체 같은지
System.out.println("p1 == p2 : " + (p1 == p2) );
System.out.println("p1.equals(p2) : " + p1.equals(p2) );
System.out.println("========================================");
Set<Person> pSet = new HashSet<Person>();
boolean isAdded = pSet.add(p1);
System.out.println("p1 추가 후 :" + isAdded); //true
isAdded = pSet.add(p2);
System.out.println("p2 추가 후 :" + isAdded); //false
isAdded = pSet.add(p3);
System.out.println("p3 추가 후 :" + isAdded); // true
System.out.println();
System.out.println("pSet 데이터 : " + pSet);
}
}
class Person{
private int id;
private String name;
//방법 1
// @Override //재정의
// public boolean equals(Object obj) {
//
// Person p = (Person) obj;
// //id 같고 && Name 같게 해줌
// return (this.getId() == p.getId()) && this.getName().equals(p.getName());
// }
// 방법2 자동완성 이용 Genate hachcode() and equals()
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
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;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}