Set
- Set은 내부 데이터를 중복해서 저장할 수 없고, 저장된 객체에 순서가 없다.
- 따라서 Set은 List와 같이 인덱스를 사용하여 원소에 바로 접근할 수 없다.
HashSet
- Java는 내부적으로 Set 인터페이스를 따로 정의해 두었다. 이곳에 다양한 Set 구현체를 활용하여 코드를 작성할 수 있는데, HashSet은 기본적인 Set의 특성을 그대로 반영한 클래스이다.
Set<Integer> set = new HashSet<>();
set.add(5);
set.add(5);
set.add(1);
set.add(1);
set.add(3);
System.out.println(set);
- 다음과 같이 중복된 자료를 저장하더라도 중복되지 않게 저장되는 것을 확인할 수 있다.
TreeSet
- Set은 TreeSet을 사용하여 내부적으로 정렬된 상태를 유지하도록 할 수 있다.
TreeSet<Integer> set = new TreeSet<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// Set을 내림차순으로 정렬하는 기준 설정
return Integer.compare(o2, o1);
}
});
set.add(5);
set.add(5);
set.add(1);
set.add(1);
set.add(3);
System.out.println(set.pollFirst());
System.out.println(set.pollLast());
System.out.println(set);
- 또 코드와 같이 Deque의 특성을 가지고 있어, 앞뒤로 꺼내는 연산이 가능하다.
LinkedHashSet
- Set은 삽입 순서를 보장하지 않는다. 하지만 LinkedHashSet은 연결리스트 형태로 구현이 되어 있기 때문에 삽입 순서를 보장하는 특징이 있다.
LinkedHashSet<Integer> set = new LinkedHashSet<>();
set.add(5);
set.add(5);
set.add(1);
set.add(1);
set.add(3);
set.add(7);
set.add(-1);
System.out.println(set);