[Java] HashSet

eeminsu·2021년 11월 19일
0
post-thumbnail

자바의 정석을 통해 공부한 내용을 요약하였습니다.

HashSet

1. 특징

  • Set인터페이스를 구현한 가장 대표적인 컬렉션으로 입력된 순서와 상관없이 저장하며 중복된 요소를 저장하지 않는다.
  • 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야 한다.


2. 메서드

2-1. 생성자

  • HashSet() - HashSet 객체를 생성
  • HashSet(int initialCapacity) - 주어진 값을 초기용량으로하는 HashSet 객체를 생성

2-2. 추가

  • boolean add(Object o) - 새로운 객체를 저장
  • boolean addAll(Collection c) - 주어진 컬렉션에 저장된 모든 객체들을 추가(합집합)

2-3. 삭제

  • boolean remove(Object o) - 지정된 객체를 삭제
  • boolean removeAll(Collection c) - 주어진 컬렉션에 저장된 모든 객체와 동일한 객체 삭제(차집합)
  • boolean retainAll(Collection c) - 주어진 컬렉션에 저장된 객체와 동일한 것만 남기고 삭제(교집합)
  • void clear() - 모든 객체 삭제

2-4. 기타

  • int size() - 저장된 객체의 개수 반환
  • boolean isEmpty() - HashSet이 비어있는지 확인


3. 비고

HashSet의 add메서드는 기존에 저장된 요소와 같은 것인지 판단하기 위해 equals() 와 hashCode()를 호출한다.
그렇기 때문에 equals()와 hashCode()를 목적에 맞게 오버라이딩 해주어야 한다.
equals()와 hashCode()는 Object 클래스의 메서드이다.

예를 들어 아래와 같은 Person객체가 있다고 했을 때 멤버 변수의 값이 같은 인스턴스를 HashSet에 add를 하게되면 중복처리가 되지않고 두 인스턴스 모두 저장된다.

class Person {
	String name;
	int age;

	Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String toString() {
		return name +":"+ age;
	}
}

이럴 경우 equals()와 hasCode()를 오버라이딩 해줘야 중복처리가 되는 것을 방지할 수 있다.

public boolean equals(Object obj) {
	if(obj instanceof Person2) {
		Person2 tmp = (Person2)obj;
		return name.equals(tmp.name) && age==tmp.age;
	}

	return false;
}

public int hashCode() {
	return (name+age).hashCode();
}

hashCode()는 아래와 같이 Objects클래스를 이용해서도 오버라이딩 할 수 있다.

public int hashCode() {
	return Objects.hash(name, age);
}
profile
안되면 될 때까지

0개의 댓글