개발 무지렁이

[Java] Set 중복체크, hashCode와 equals 본문

Backend/자바

[Java] Set 중복체크, hashCode와 equals

Gaejirang-e 2023. 4. 17. 20:38

Set 중복체크


먼저, hashCode()를 호출해서 리턴값이 다르면 다른 객체로 인식하고,
hashCode() 리턴값이 같으면 equals()를 호출해서
true이면 같은 객체, false이면 다른 객체로 인식

[Member.java]

  public class Member {
      private String name;
      private int age;
      private String addr;
      public Member() {}
      public Member(String name, int age, String addr) {
          this.name = name;
          this.age = age;
          this.addr = addr;
      }
      public String getName() {
          return name;
      }

      @Override
      public int hashCode() {
          return name.hashCode();
      }

      @Override
      public boolean equals(Object obj) {
          if(obj instanceof Member) {
              Member m = (Member)obj;
              if(name.equals(m.getName()) {
                  return true;
              }
          }
          return false;
      }
if (vehicle instanceof Bus)
: Vehicle 인터페이스 변수에 대입된 객체가 Bus일 경우

WHY
hasCode에서 리턴값을 한번 비교한 것을 왜 equals에서 문자열 자체를 비교할까?
이름이 같으면(문자열이 같으면) 해당 HashCode는 같다.
다만, 가끔은 문자열이 달라도 HashCode가 같을 수 있다.
따라서, hashCode()의 반환값이 같더라도, 문자열 자체를 비교해줌으로서
객체의 같음의 기준(위의 코드에서는 name)을 정확하게 확인한다.

[MemberSetExam.java]

  public class MemberSetExam {
      private Set<Member> set = new HashSet<>();
      public MemberSetExam() {
          set.add(new Member("홍길동", 10, "서울"));
          set.add(new Member("홍길동", 30, "인천"));
          set.add(new Member("이몽룡", 24, "광주"));
          System.out.println("저장된 객체의 개수: " + set.size()); // 2
      }
      public static void main(String[] args) {
          new MemberSetExam();
      }
  }

💡 해당 객체의 같음의 기준은 name이다

Comments