본문 바로가기

Java/기본

[Java] 컬렉션프레임워크104 - Set 컬렉션

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) 보장되지 않는다. 

HashSet 상속구조

 

코드 예제

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) 보장되지 않는다. 

TreeSet 상속구조

코드예제

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+ " ");   //김유신 윤봉길 이순신 임꺽정 혁거세 홍길동
        }
    }
}