Algorithm

[알고리즘] HashSet

Gyuri 2022. 6. 26. 18:03

HashSet이란?

HashSet이란 Set 인터페이스의 구현 클래스로, Set의 성질을 그대로 상속받는다. Set은 객체를 중복해 저장할 수 없고, 하나의 null값만 저장할 수 있으며, 저장 순서가 유지되지 않는다.

만약 요소의 저장 순서를 유지해야 한다면, LinkedHashSet 클래스를 사용하면 된다.

 

Set 인터페이스를 구현한 클래스로는 HashSet과 TreeSet이 있는데,

HashSet은 정렬을 해주지 않고 TreeSet은 자동정렬을 해준다는 차이가 있다.

 

Set의 가장 큰 장점은 중복을 자동으로 제거해준다는 점이다. 

 

Set은 위 그림과 같이 주머니 형태로 되어있고, 비선형 구조이기 때문에 순서가 없다. 따라서, 인덱스도 존재하지 않는다. 

값을 추가하거나 삭제할 땐 내가 추가/삭제하고자 하는 값이 Set 내부에 있는 지 검색한 후 추가나 삭제를 해야하므로 속도가 List 구조에 비해 느리다.

 


 

HashSet 선언

HashSet<Integer> set = new HashSet<Integer>(); // HashSet 생성
HashSet<Integer> set2 = new HashSet<Intege>(10); // 초기 용량 지정

 

HashSet 값 추가

HashSet<Integer> set = new HashSet<Integer>();
set.add(1); // HashSet에 값 추가
set.add(2);

 

HashSet 값 삭제

HashSet<Integer> set = new HashSet<Integer>();
set.remove(1); // HashSet에서 값 1 제거
set.clear(); // 모든 값 제거

 

HashSet  크기 구하기 

 : size() 메소드 사용

HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3)); // HashSet생성
System.out.print(set.size()); //set 크기 : 3

 

HashSet  값 출력

 : Set 컬렉션은 그냥 print하는 경우 대괄호로 묶여 set의 전체 값이 출력된다. Set에는 인덱스로 객체를 가져오는 get() 메소드가 없다.

전체 객체를 대상으로 한 번씩 반복해 가져오는 반복자(Iterator)를 제공한다. 이는 iterator() 메소드를 호출하면 얻을 수 있다. Iterator에서 하나의 객체를 가져올 때는 next() 메소드를 사용한다.

next() 메소드를 사용하기 전, 먼저 가져올 객체가 있는 지 확인하는 것이 좋다.

hasNext() 메소드는 가져올 객체가 있으면 true, 없으면 false를 리턴한다.

HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3)); // HashSet 생성

System.out.print(set); // HashSet 출력 [1, 2, 3]

Iterator iter = set.iterator(); // Iterator 사용 위해 iterator 메소드 호출
while(iter.hasNext()) { // 가져올 객체 있는 지 확인 (값이 있으면 true, 없으면 false)
	System.out.println(iter.next()); // 하나의 객체 가져옴
}

 

HashSet 값 검색

 : HashSet 내부에 원하는 값이 있는지 확인하고 싶은 경우, contains() 메소드를 사용하면 된다. 파라미터로 주어진 객체가 HashSet이 갖고있다면 true, 아니면 false를 반환한다.

HashSet<Integer> set = new HashSet<Integer>(Arrays.asList(1,2,3));
System.out.print(set.contains(1)); // set내부에 값 1이 있는지 검사 (true)