관리 메뉴

제뉴어리의 모든것

[Section1][Java] 컬렉션 - 컬렉션프레임웍 - 2 (Set) 본문

코드스테이츠/정리 블로깅

[Section1][Java] 컬렉션 - 컬렉션프레임웍 - 2 (Set)

제뉴어리맨 2022. 7. 14. 16:39

Set

수학의 집합과 같은 개념의 컬렉션이다.
그러므로 중복을 허용하지 않고, 순서 또한 존재하지않는다.
그러므로 저장순서는 지켜지지 않는다.

 

Set의구현체

  • HashSet
    Set의 특징대로 저장 순서가 유지 되지 않으며, 중복을 허용하지 않는다.
    데이터를 추가, 삭제, 검색 하는데 해시값이 사용된다.


    - 중복을 검증하는 과정
    add() 를 사용하여 데이터를 추가하려 할때 HashSet의 내부적으로는 해당 데이터(객체)를 hashCode() 메소드를 이용하여 해시값을 구한다. 그리고 HashSet에 저장되어 있는 모든 데이터의 해시값과 들어온 데이터의 해시값을 비교하여 여 같은 해시값이 존재하는지 체크한데, 그리하여 존재할 경우 데이터를 추가하지 않고, 존재하지 않을 경우는 데이터를 추가한다.


  • TreeSet
    TreeSet은 Set의 특징은 그대로 가지고 있고, 이름에서 보듯이 이진트리를 사용한 Set 구현체이다.
    그러므로 데이터들은 자동으로 정렬(오름차순)이 된다.

 

 

HashSet과 TreeSet의 코드로 보는 차이점

 

  • 코드
import java.util.HashSet;
import java.util.TreeSet;

public class HashSetPractice {
    public static void main(String[] args) {
        HashSet<String> hashSet = new HashSet<>();

        hashSet.add("Floor");
        hashSet.add("Baseball");
        hashSet.add("Abastract");
        hashSet.add("Cat");
        hashSet.add("ask");
        hashSet.add("ask"); //중복 데이터

        System.out.println("HashSet : " + hashSet);

        TreeSet<String> treeSet = new TreeSet<>();

        treeSet.add("Floor");
        treeSet.add("Baseball");
        treeSet.add("Abastract");
        treeSet.add("Cat");
        treeSet.add("ask");
        treeSet.add("ask"); //중복 데이터

        System.out.println("TreeSet : "+treeSet);
    }
}

 

  • 결과

HashSet과 TreeSet 모두 중복하여 add한 "ask"란 값을 하나만 가지고 있으며,
TreeSet은 정렬이 되어 있다. (아스키 코드값 순서이다, 대문자가 모든 소문자보다 아스키 값이 작으므로 먼저 정렬이되었다)
참고로 현재 결과화면에서는 HashSet의 데이터가 저장순서대로 출력되었지만, 이것은 보장될 수 없다.
HashSet의 데이터를 저장하는 기준이 메모리의 빈공간을 우선적으로 채워넣는 방식이기때문에 add하는 데이터가 메모리에 어떤 위치에 저장될지 모르고 그 주소의 해시값은 어떤 순서일지 모르기 때문이다.