equals 재정의 후 hashCode를 재정의해야 하는가?

****

equals만 재정의 한 경우

import java.util.*;

public class Car {
	private final String name;
	
	public Car(String name) {
	    this.name = name;
	  }
	
	@Override
	public boolean equals(Object o) {
		if (this == o)return true;
		if (o == null || getClass() != o.getClass()) return false;
		    Car car = (Car) o;
		return Objects.equals(name, car.name);
  }
}

class Car Test {
	public static void main(String[] args) {
	    Car carA =new Car("sasca");
	    Car carB =new Car("sasca");
	    System.out.println(carA.equals(carB));// true
	
	
	    List<Car> carList =new ArrayList<>();
	    carList.add(new Car("sasca"));
	    carList.add(new Car("sasca"));
	    System.out.println(carList.size());// 2Set<Car> carSet =new HashSet<>();
	    carSet.add(new Car("sasca"));
	    carSet.add(new Car("sasca"));
	    System.out.println(carSet.size());//2 (문제 발생)
	  }
}

****

hash Collection 동작 과정

System.out.println(carA.hashCode());// 2109957412
System.out.println(carB.hashCode());// 901506536

****

hashCode도 같이 재정의한 경우

@Override
public int hashCode() {
	// return Objects.hash(name); JAVA 7return name.hashCode();
}

System.out.println(carA.hashCode());// 109208323
System.out.println(carB.hashCode());// 109208323

Set<Car> carSet =new HashSet<>();
carSet.add(new Car("sasca"));
carSet.add(new Car("sasca"));
System.out.println(carSet.size());// 1 정상 동작