Java HashSet

Seoyeon Kim·2023년 3월 7일
0

공식 문서

Class HashSet

This class implements the Set interface, backed by a hash table (actually a HashMap instance). It makes no guarantees as to the iteration order of the set; in particular, it does not guarantee that the order will remain constant over time. This class permits the null element.

번역

이 클래스는 해시 테이블(실제로는 HashMap 인스턴스)이 지원하는 Set 인터페이스를 구현합니다. 집합의 반복 순서를 보장하지 않습니다. 특히 순서가 일정하게 유지된다는 보장이 없습니다. 이 클래스는 null 요소를 허용합니다.

add

public boolean add (E e)
Adds the specified element to this set if it is not already present. More formally, adds the specified element e to this set if this set contains no element e2 such that Objects.equals(e, e2). If this set already contains the element, the call leaves the set unchanged and returns false.

번역

e가 아직 존재하지 않는 경우 Set에 추가합니다. 더 명확히 말하자면, Objects.equals(e, e2)을 통해 기존 Set에 e2가 포함되어 있지 않음을 확인하고 e를 Set에 추가합니다. Set에 이미 e가 포함되어 있으면 Set은 변경하지 않으며 false를 반환합니다.

remove

public boolean remove (Object o)
Removes the specified element from this set if it is present. More formally, removes an element e such that Objects.equals(o, e), if this set contains such an element. Returns true if this set contained the element (or equivalently, if this set changed as a result of the call). (This set will not contain the element once the call returns.)

add와 마찬가지로 Object.equals() 를 사용하여 중복을 검사한다는 것을 알 수 있다.

hashcode()

public int hashCode()
Returns a hash code value for the object. This method is supported for the benefit of hash tables such as those provided by HashMap.

객체의 hashCode는 객체가 가지고 있는 데이터를 기반으로 생성된다. 기본적으로 Object 클래스의 hashCode() 메소드는 객체의 메모리 주소를 반환하지만, 대부분의 클래스에서는 이 메소드를 오버라이드하여 객체의 실제 내용을 기반으로 hashCode를 생성한다.

equals()

public boolean equals (Object obj)
Indicates whether some other object is "equal to" this one.
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

hashCode 메서드를 재정의하여 동일한 객체에 동일한 해시 코드를 갖도록 만들어야 객체의 동일성 유무를 판단할 수 있다.

일반적으로 hashCode() 메소드를 오버라이드하는 경우, equals() 메소드도 함께 오버라이드한다. equals() 메소드는 두 객체가 동일한지 여부를 판단하며, hashCode() 메소드의 값과 일치해야 한다. 따라서, 두 객체가 같으려면 hashCode() 값과 equals() 값이 동일해야 한다.

정리

hashcode()는 객체를 구분하기 위한 정수 값을 반환하는 메서드다. 이 메서드의 반환값은 객체가 속한 HashMap, HashSet, HashTable 등의 자료구조에서 Key를 구분하기 위한 해시 값으로 사용된다. 따라서 hashcode() 메서드의 반환값이 다른 객체는 서로 다른 Key로 취급된다. 하지만 같은 객체라고 해서 hashcode()의 반환값이 항상 같아야 하는 것은 아니다.

반면 equals()는 객체의 내용이 같은지를 비교하기 위한 메서드다. 객체의 equals() 메서드가 true를 반환한다면, 두 객체는 내용이 같다는 것을 의미한다. 따라서 같은 객체인지 여부를 판단하는 데에 사용된다.

단, equals()가 true를 반환하면 hashCode()도 true를 반환해야 하는 계약 관계를 갖는다. 따라서, equals()를 오버라이드 할 때마다 계약 조건을 충족하도록 hashCode()도 오버라이드 해야 한다.

위의 공식 문서에 따르면 HashSet은 equals()를 통해 객체의 동일성 여부를 판단하기 때문에 상황에 따라 객체의 hashcode()와 equals()를 재정의해야 한다.

0개의 댓글