Set 개요
Set 컬렉션은 저장순서가 유지되지 않고, 객체를 중복해서 저장할 수 없다. null도 객체로 보기 때문에 저장할 수 있지만 역시 1개만 저장이 가능하다. index로 관리되지 않기 때문에 동일한 객체들을 저장한 Set이라고 하더라도 그 안의 요소들을 꺼내올 때의 순서는 같지 않을 수 있다.
List 와의 차이점
Set은 순서와 중복에 상관없이, 존재여부만을 확인하고자 할 때 List보다 유용하게 사용될 수 있다.
Set 컬렉션의 구현 클래스
AbstractSet, ConcurrentHashMap.KeySetView, ConcurrentSkipListSet, CopyOnWriteArraySet, EnumSet, HashSet, JobStateReasons, LinkedHashSet, TreeSet 등
HashSet | 데이터를 HashTable에 저장한다. 성능이 우수하다 |
TreeSet | 데이터 삽입과 동시에 이진트리 방식으로 정렬이 이루어진다 |
LinkedHashSet | LinkedList 처럼 링크로 연결된 구조를 가진다. 저장된 순서대로 값이 정렬된다 |
Set 컬렉션의 주요 메서드
메서드 | 내용 |
boolean add(E e) | (추가하려는 객체가 없다면) Set 에 객체 추가하기 |
void clear() | Set 의 모든 객체 삭제하기 |
boolean contains(Object o) | 해당 객체를 가지고 있는지 여부 |
boolean equals(Object o) | 동일한 Set인지 여부 |
boolean isEmpty() | Set 이 비었는지 여부 |
Iterator<E> iterator() | 반복자 가져오기 |
boolean remove(Object o) | Set 의 특정 객체를 삭제하기 |
int size() | Set 의 크기 가져오기 |
Object[] toArray() | 배열 형식으로 리턴 |
HashSet
Set 인터페이스를 구현하는 클래스이다. 데이터 정렬과 반복처리(iteration)에 순서는 보장되지 않는다.
멀티 스레드 환경에서 동기화(synchronized) 보장되지 않는다.
코드 예제
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Test_HashSet {
public static void main(String[] args) {
Set<String> nameSet01 = new HashSet<>();
Set<String> nameSet02 = new HashSet();
String[] strArr = {"홍길동", "임꺽정", "이순신", "홍길동", "김유신", "혁거세", "윤봉길"};
for(int i=0; i< strArr.length; i++){
nameSet01.add(strArr[i]);
}
for(int i=0; i< strArr.length; i++){
nameSet02.add(strArr[i]);
}
//set은 중복을 허용하지 않으므로 "홍길동"은 1번만 들어간다
int size01 = nameSet01.size();
System.out.println(size01); //6
boolean contain01 = nameSet01.contains("홍길동");
boolean contain02 = nameSet01.contains("김연아");
System.out.println(contain01); //true
System.out.println(contain02); //false
//Set의 동등성 확인
boolean isEqual01 = nameSet01.equals(nameSet02);
System.out.println(isEqual01); //true
//요소 삭제
boolean remove01 = nameSet01.remove("혁거세");
boolean remove02 = nameSet01.remove("이봉창");
System.out.println(remove01); //true
System.out.println(remove02); //false
//Set의 동등성 확인
boolean isEqual02 = nameSet01.equals(nameSet02);
System.out.println(isEqual02); //false
//iterator() 메서드를 사용해 반복자 가져오기
Iterator<String> iterator = nameSet01.iterator();
//요소 가져오기
while(iterator.hasNext()){
String name = iterator.next();
System.out.printf(name+ " "); //윤봉길 홍길동 김유신 이순신 임꺽정
}
}
}
TreeSet
Set 인터페이스를 구현하는 클래스이다. 데이터 삽입과 동시에 요소들간 정렬이 이루어진다.
멀티 스레드 환경에서 동기화(synchronized) 보장되지 않는다.
코드예제
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class Test_TreeSet {
public static void main(String[] args) {
String[] strArr01 = {"홍길동", "임꺽정", "이순신", "홍길동", "김유신", "혁거세", "윤봉길"};
String[] strArr02 = {"임꺽정", "혁거세", "윤봉길", "홍길동", "김유신", "이순신", "홍길동"};
Set<String> nameSet01 = new TreeSet<>();
Set<String> nameSet02 = new TreeSet<>();
for(int i=0; i<strArr01.length; i++){
nameSet01.add(strArr01[i]);
}
for(int i=0; i<strArr02.length; i++){
nameSet02.add(strArr02[i]);
}
//set동등성 확인
boolean equal01 = nameSet01.equals(nameSet02);
System.out.println(equal01); //true
//반복자를 통해 출력해보면
//TreeSet의 요소들이 오름차순 정렬된 것을 확인할 수 있다
Iterator<String> iterator01 = nameSet01.iterator();
while (iterator01.hasNext()) {
String str01 = iterator01.next();
System.out.print(str01+ " "); //김유신 윤봉길 이순신 임꺽정 혁거세 홍길동
}
Iterator<String> iterator02 = nameSet01.iterator();
while (iterator02.hasNext()) {
String str01 = iterator02.next();
System.out.print(str01+ " "); //김유신 윤봉길 이순신 임꺽정 혁거세 홍길동
}
}
}
'Java > 기본' 카테고리의 다른 글
[Java] 컬렉션프레임워크201 - Comparable, Comparator (0) | 2021.06.25 |
---|---|
[Java] 컬렉션프레임워크105 - Map 컬렉션 (0) | 2021.06.24 |
[Java] 컬렉션프레임워크103 - List 컬렉션 - Stack, queue (0) | 2021.06.24 |
[Java] 컬렉션프레임워크102 - List 컬렉션 - ArrayList, LinkedList, Vector (0) | 2021.06.24 |
[Java] 컬렉션프레임워크101 - 컬렉션프레임워크CollectionFramework 개념잡기 (0) | 2021.06.24 |