HashSet

0

Collection

목록 보기
8/11

HashSet - 순서 X, 중복 X

List : 순서 O, 중복 O

Set 인터페이스를 구현한 클래스 : HashSet, SortedSet, TreeSet

HashSet

  • Set 인터페이스를 구현한 대표적인 클래스
  • 순서를 유지하려면, LinkedHashSet 클래스를 사용하면 된다.

TreeSet

  • 범위 검색과 정렬에 유리한 컬렉션 클래스
  • 데이터가 많아질 수록 HashSet보다 데이터 추가, 삭제에 시간이 더 걸림

주요 메서드

HashSet()
HashSet(Collection c)
HashSet(int initialCapacity) // 초기용량
HashSet(int initialCapacity, float loadFactor) // loadFactor만큼 데이터가 차면 2배로 생성

추가
boolean add(Object o)
boolean addAll(Collection c) // 합집합

삭제
boolean remove(Object o)
boolean removeAll(Collection c) // 교집합
boolean retainAll(Collection c) // 조건부 삭제, 차집합
void clear() // 모두 삭제

boolean contains(Object o) // 객체가 포함되어있는지 여부
boolean containsAll(Collection c) // 여러객체가 모두 포함 되는지 여부
Iterator iterator()

boolean isEmpty() // 비어있는지 여부
int size()
Object[] toArray() // 객체 배열로 반환
Object[] toArray(Object[] a)

  • HashSet은 객체를 저장하기전에 기존에 같은 객체가 있는지 확인
    같은 객체가 없으면 저장하고, 있으면 저장하지 않는다.
  • boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출
    *equals()와 hashCode()가 오버라이딩 되어 있어야함

객체간의 비교이기 때문에 객체의 값을 정확하게 비교해야되기 때문이다.

class Person {
	String name;
	int age;
	public Person(String name, int age) {
		this.age = age;
		this.name = name;
	}
	public String toString() {
		return name+":"+age;
	}
	@Override
	public int hashCode() {
		return Objects.hash(age, name);
	}
	@Override
	public boolean equals(Object obj) {
		if(!(obj instanceof Person)) return false;
		
		Person p = (Person)obj;
		
		return this.name.equals(p.name) && this.age == p.age;
	}
}

class를 작성할 때 equals()와 hashCode()를 오버라이딩해야 HashSet이 바르게 동작
(하지 않는다면 중복된 데이터가 담길 수 있다)

0개의 댓글