반응형

 

자바 - HashSet 사용방법 (개념, 특징, 메소드 및 예제)

 

 

컬렉션의 한 종류로 데이터의 중복을 허락하지 않고 기본적으로 순서에 상관없이 저장되는 HashSet에 대해서 알아보도록 하겠습니다. 

 

 

   목차

  1. HashSet이란?
  2. HashSet 생성방법
  3. HashSet 메서드
    • 데이터 추가 / 삭제 / 확인 / 반환
  4. HashSet 사용예제

 

 

1. HashSet이란?

 

HashSet은 컬렉션의 하나로 중복되지 않는 데이터를 순서에 상관없이 저장합니다. 따라서 데이터의 집합간에 교집합, 합집합, 차집합 데이터를 편리하게 구할수 있습니다. 이처럼 HashSet은 데이터의 중복을 허용하지 않기 때문에 저장 요청이 왔을 때 기존 데이터에 같은 데이터가 있는지 여부를 판단해야 합니다. 따라서 정상적으로 HashSet을 사용하기 위해서는 데이터로 사용될 객체의 equals()와 hashCode() 메서드가 사전에 사용자가 원하는 방식으로 비교될 수 있도록 오버라이딩 되어 있어야합니다. 

 

 

 

2. HashSet 생성방법

  • (방법1) HashSet<String> h1 = new HashSet<String>( );         // 기본 capacity는 16, load factor는 0.75
  • (방법2) HashSet<String> h2 = new HashSet<String>(20);       //  초기 capacity를 20으로 설정 (load factor는 0.75)
  • (방법3) HashSet<String> h3 = new HashSet<String>(20, 0.8); //  초기 capacity를 20, load factor는 0.8로 설정
  • (방법4) HashSet<String> h4 = new HashSet<String>(h1);      //  지정된 컬렉션(h1)의 데이터를 가진 HashSet 생성

cf) 여기에서 capacity는 저장용량을 의미하고, load factor는 데이터 저장공간을 추가로 확보해야 하는 시점을 지정하는 변수입니다. 기본값은 0.75이며 이는 저장공간의 75%가 사용되어지고 있을때 저장공간을 추가로 확보합니다. 

 

 

 

3. HashSet 메서드

 

1) 데이터 추가

  1. boolean add (E e) : 기존 데이터에 데이터 e가 없을 경우 데이터 e를 추가합니다. 
  2. boolean addAll (Collection<? extends E> c) : 기존 데이터에 없는 컬렉션 c의 모든 데이터를 추가합니다. 

 

2) 데이터 삭제

  1. void clear( ) : 모든 데이터를 삭제합니다. 
  2. boolean remove(Obejct o) : 기존 데이터에서 Object o를 삭제합니다.
  3. boolean removeAll(Collection<?> c) : 기존 데이터에서 컬렉션 c의 모든 데이터를 삭제합니다.
  4. boolean retainAll(Collection<?> c) : 기존 데이터에서 컬렉션 c와 일치하는 데이터만 남기고 나머지는 삭제합니다.

 

3) 데이터 확인

  1. int size( ) : 데이터의 개수를 반환합니다. 
  2. boolean isEmpty( ) : HashSet에 데이터가 하나도 없는지 여부를 반환합니다. (없으면 true)
  3. boolean contains(Obejct o) : 기존 데이터에 Object o가 포함되어 있는지 여부를 반환합니다. (포함되어 있으면 true)

 

4) 데이터 반환

  1. Object[ ] toArray( ) : 현재 HashSet의 모든 데이터를 Object 배열로 반환합니다. 
  2. <T> T[ ] toArray(T[ ] a) : 현재 HashSet의 모든 데이터를 배열 a에 담아 반환합니다.

 

 

 

4. HashSet 사용예제

 

1) Student 클래스 정의 및 equals(), hashCode(), toString() 오버라이드

public class Student {
	private String name;
	private int age;
	
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
		
	@Override
	public int hashCode() {
		return Objects.hash(age, name);
	}
	
	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof Student)) return false;
		
		Student other = (Student) obj;
		return age == other.age && Objects.equals(name, other.name);
	}

	@Override
	public String toString() {
		return "[" + name + "," + age + "]";
	}
}

 

2) HashSet 생성 및 실행

public class HelloWorld {
	public static void main(String[] args) {
		HashSet<Student> h1 = new HashSet<Student>();
		
		h1.add(new Student("A", 10));
		h1.add(new Student("B", 11));
		h1.add(new Student("C", 12));
		h1.add(new Student("C", 12));
		h1.add(new Student("C", 20));
		System.out.println(h1);
		System.out.println("[1]: " + h1.size());
		System.out.println("[2]: " + h1.isEmpty());
		System.out.println("[3]: " + h1.contains(new Student("C", 20)));
		
		h1.remove(new Student("C", 20));
		System.out.println(h1);
	}
}

 

3) 실행결과

[[C,20], [A,10], [B,11], [C,12]]
[1]: 4
[2]: false
[3]: true
[[A,10], [B,11], [C,12]]

 

반응형

+ Recent posts