💡Equals과 [==]
📘 기본형 변수와 참조형 변수의 비교 방법 차이
물리적비교 : ==
//기본형 변수
int a = 2;
int b = 2;
System.out.println(a == b); // true
//참조형 변수
String c = new String("hi");
String d = new String("hi");
System.out.println(c == d); // false
Stack 영역에 저장된다.Heap 영역에 저장되며, Stack 영역에는 객체의 주소가 저장되며, 저장 된 값이 같더라도 서로 다른 주소로 객체가 저장되게 된다.== 연산자로 비교하게 되면, Stack 영역에 있는 주소값을 서로 비교하게 되므로 서로 다른 객체로 판별하게 된다.논리적비교 : eauals()
//참조형 변수
String a = new String("hi");
String b = new String("hi");
System.out.println(a.equals(b)); // true
true 반환Object 비교
equals() 는 ==와 동일하게 동작한다.재정의(Override) 해야 논리적 비교가 제대로 작동한다.//eauals() 와 hashCode() 모두 재정의 해야한다.
@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
Item item = (Item) o;
return Objects.equals(this.name, item.name);
}
@Override
public int hashCode() {
return Objects.hashCode(name);
equals() 가 논리적으로 제대로 판별을 하게되며, Map, Set 에 중복되어 있는 값도 판별할 수 있다.hashCode()
정수값(hashCode)을 반환하는 메서드로 HashCode 값이 같으면 객체를 빠르게 찾거나 비교할 수 있다.hashCode() 로 빠르게 위치를 찾고 , equal() 로 정밀 비교를 한다.equals() 와 같이 재정의 하지 않으면 HashMap, HashSet 같은 데서 이상하게 동작하게 된다.HashCode 도 같지만, HashCode 가 같다고 해서 내용이 같지는 않다.