백엔드 개발자 2024. 7. 13. 12:18

 

 

  • 중복되지 않는 요소들의 집합

 

 

 

주요 클래스 장점 단점
HashSet 성능이 빠르고 메모리 적게 사용 순서 관련 기능 없음 (보장하지 않음)
LinkedHashSet 요소들을 입력 순서대로 정렬 (내부적으로 링크 사용) HashSet보다는 성능 떨어짐
TreeSet 요소들을 특정 기준대로 정렬 (기본 오름차순) 데이터 추가/삭제에 시간 더 소모

 

 

 

 

 

HashSet


  • 중복 add는 처리되지 않는다. intHset1에는 1,2,3만 들어가 있다.

 

  • ints1은 ArrayList로 10개의 요소를 가지고 있지만, 이를 Set으로 변환시키면 중복이 제거되어 7개의 요소만 남는 것을 볼 수 있다.

 

 

				//  💡 for-each문 사용 가능
        for (Integer i :intHSet1) {
            System.out.println(i);
        }

 

 

 

셋을 사용해서 중복제거된 리스트 

  • Set으로 변환한 다음 리스트를 초기화한다. 그리고 addAll로 Set을 리스트에 넣는 방식. 

 

 

 

해시 ( 해시셋이 이용하는 방식)

  • 내부적으로 16개까지는 정렬이 되는 것처럼 보이나, 그 이후에는 재조정 되니 정렬 목적으로는 사용하지 말자.

 

 

해시 셋의 메서드

		//  포함 여부
        boolean has2 = intHSet1.contains(2);
        boolean has4 = intHSet1.contains(4);

        //  요소 삭제, 있었는지 여부 반환
        boolean rm3 = intHSet1.remove(3);
        boolean rm4 = intHSet1.remove(4);
  • contains : intHSet1에 2라는 요소가 있는지 여부를 boolean값으로 반환.
  • remove : contains에서 요소를 삭제하는 부분만 추가됨.

 

				//  다른 콜렉션 기준으로 내용 삭제
        intHSet2.removeAll(intHSet1);

        //  💡 그 외 size, isEmpty, clear, clone 등의 메소드들 확인

  • intHSet2의 요소들 중 intHSet1과 겹치는 요소들을 전부 제거 하는 메서드.

 

참조형 관련

 

  • 참조형은 인스턴스의 참조가 다르면 새로운 객체로 인식하기 때문에, 맨처음 생성해놓은 swordman이외에 새인스턴스로 넣은 2개까지 총 3개가 들어간다.
  • 인스턴스 요소를 지우려면 동일한 참조값으로 지워야 하는데, 인스턴스를 생성해서 바로 넣은 경우에는 인스턴스 주소가 없으니 clear로만 제거해야 한다.

 

HashSet, LinkedHashSet, TreeSet 방식 비교

 

  • LinkedHashSet은 입력된 순서대로 들어가는걸 볼 수 있고, TreeSet은 오름차순으로 정렬되는 걸 볼 수 있다.
  • HashSet은 순서가 보장되는 것처럼 보이지만, 16개 이상부터는 재조정되서 정렬이 보장되지는 않는다.

 

 

문자열로 정렬해볼 경우

  • HashSet은 숫자가 아니니 정렬이 바로 보장 안되는 것을 볼 수 있었다.
  • LinkedHashSet은 그대로 숫자처럼 입력순서대로 정렬되는 것을 볼 수 있다.
  • TreeSet은 알파뱃 순서대로 정렬된다.

 

 

 

 

 

 

Red-Black Tree


TreeSet에 사용되는 알고리즘

 

한 요소를 기준으로 작은 값과 큰값 이분해서 정렬되므로, 검색시에 LinkedHashSet보다 속도가 빠르다.

요소 추가/제거 시에는 과정이 복잡하여 메모리나 시간이 더 소요된다.

 

 

 

				//  💡 TreeSet의 주요 메소드들
        int firstInt = intTreeSet.first();
        String lastStr = strTreeSet.last();

 

  • last() 메서드의 경우 Set<String> strTreeSet = new TreeSet<>() 이런식으로 선언하는게 아니라 
    TreeSet<String> strTreeSet = new TreeSet<>();  맨앞 받아주는 자료형도 TreeSet으로 선언해야 에러가 나지 않는다고 한다.
  • 가장 맨앞의 작은값, 맨뒤의 큰값을 출력해준다.(first, last)

 

//  같은 것이 없다면 트리구조상 바로 위의 것 (바로 더 큰 것) 반환
        String foxCeiling = strTreeSet.ceiling("Fox");
        String creamCeiling = strTreeSet.ceiling("Cream");

        //  같은 것이 없다면 트리구조상 바로 아래의 것 (바로 더 작은 것) 반환
        String foxFloor = strTreeSet.floor("Fox");
        String diceFloor = strTreeSet.floor("Cream");

 

  • 같은 것이 없으면 바로 위의 것을 반환하는 ceiling
  • 같은 것이 없으면 바로 아래의 것을 반환하는 floor

 

 

 

				//  맨 앞에서/뒤에서 제거

        int pollFirst1 = intTreeSet.pollFirst();
        int pollFirst2 = intTreeSet.pollFirst();

        int pollLast1 = intTreeSet.pollLast();
        int pollLast2 = intTreeSet.pollLast();

 

 

				//  순서가 뒤집힌 NavigableSet 반환
        Set<String> strTreeSetDesc 
                = (TreeSet<String>) strTreeSet.descendingSet();

 

  • 순서가 거꾸로 뒤집혀있는 Set 반환하는 descendingSet

 

				//  ⚠️ 요소로 추가 불가
        //  - 이후 배울 Comparable 또는 Comparator 필요
        TreeSet<Knight> knightSet1 = new TreeSet<>();
        knightSet1.add(new Knight(Side.BLUE));
        knightSet1.add(new Knight(Side.BLUE));
        knightSet1.add(new Knight(Side.BLUE));
  • 같은 Knight 요소끼리 비교할 수 있는 기준이 없어서 요소로 추가가 불가능한 상황.
  • TreeSet을 사용하려면 요소끼리 비교할 수 있는 방법이 있어야 한다.

 

 

 

 

 

 

 

 

출처 

  •  
 

제대로 파는 자바 (Java) - by 얄코 강의 | 얄팍한 코딩사전 - 인프런

얄팍한 코딩사전 | 적당히 배워서는 살아남을 수 없는 시대. 자바, 한 번에 제대로 파서 마스터하세요!, 자바(Java), 생기초부터 활용까지 강의 하나로 한번에 끝!  🎓 대학교 이메일 계정이 있다

www.inflearn.com