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

☕ Main.java

				Set<Integer> intHSet1 = new HashSet<>();
        intHSet1.add(1);
        intHSet1.add(1);
        intHSet1.add(2);
        intHSet1.add(3);

        List<Integer> ints1 = new ArrayList(
                Arrays.asList(1, 1, 2, 2, 3, 3, 4, 5, 6, 7)
        );
        Set<Integer> intHSet2 = new HashSet<>(ints1);
				//  💡 for-each문 사용 가능
        for (Integer i :intHSet1) {
            System.out.println(i);
        }
				//  ⭐️ 아래와 같이 응용 가능
        //  - 중복을 제거한 ArrayList
        ints1.clear();
        ints1.addAll(intHSet2);

해시 hash - 해시셋이 사용하는 방식

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

        //  요소 삭제, 있었는지 여부 반환
        boolean rm3 = intHSet1.remove(3);
        boolean rm4 = intHSet1.remove(4);
				//  다른 콜렉션 기준으로 내용 삭제
        intHSet2.removeAll(intHSet1);

        //  💡 그 외 size, isEmpty, clear, clone 등의 메소드들 확인
				//  참조형 관련
        Set<Swordman> swordmenSet = new HashSet<>();
        Swordman swordman = new Swordman(Side.RED);

        swordmenSet.add(swordman);
        swordmenSet.add(swordman);
        swordmenSet.add(new Swordman(Side.RED));
        swordmenSet.add(new Swordman(Side.RED));
        //  swordmenSet.remove(swordman); // 실행해보기
				HashSet<Integer> intHashSet = new HashSet<>();
        LinkedHashSet<Integer> intLinkedHashSet = new LinkedHashSet<>();
        TreeSet<Integer> intTreeSet = new TreeSet<>();

        for (int i : new int[] { 3, 1, 8, 5, 4, 7, 2, 9, 6}) {
            intHashSet.add(i);
            intLinkedHashSet.add(i);
            intTreeSet.add(i);
        }
        for (Set s : new Set[] {intHashSet, intLinkedHashSet, intTreeSet}) {
            System.out.println(s);
        }
        //  ⭐️ LinkedHashSet : 입력된 순서대로 / TreeSet : 오름차순
        //  ⚠️ HashSet이 정렬된 것처럼 보이지만 보장된 것이 아님
        //  - Hash 방식에 의한 특정 조건에서의 정렬일 뿐