JAVA

컬렉션_HashSet(1)

고민말고생각하는사람 2024. 2. 19. 23:57

Set 인터페이스에 대해 약식으로 복기를 해보자.

Set 인터페이스 특징

- 순서를 보장하지 않는다.

- 중복을 허용하지 않는다.

- 구현클래스로 HashSet 과 SortedSet 그리고 이를 상속받는 TreeSet 이 있다. 

 

TreeSet 

- 범위 검색과 정렬에 유리한 컬렉션 클래스

- HashSet 보다 데이터 추가, 삭제에 시간이 더 걸린다.

 

HashSet 

- Set 인터페이스를 구현한 대표적인 컬렉션 클래스

 

순서를 유지하고 싶으면?

LinkedHashSet 클래스를 사용하자.

 

이번 글에선 HashSet에 대해 학습 하겠다.

 

주요 메서드

생성자 

- HashSet() - 기본 생성자

- HashSet(Collection c) - 컬렉션에 있는 값들을 HashSet에 옮겨 담는 생성자

- HashSet(int initalCapacity) - 처음 크기 설정하는 생성자

- HashSet(int initalCapacity, float loadFactor) - Collection은 할당된 메모리가 다 차면 초기 용량의 2배를 늘린다고 했다. 용량을 늘리는 시점을 정하는 것이 loadFactor 다.

ex)

HashSet(int initalCapacity : 10 , float loadFactor : 0.7)

초기 용량은 10, 70%가 차면 용량을 늘리도록 한다.

해당 HashSet에 Elements 가 7개 차면 용량이 20인 HashsSet을 생성하고, 값들 옮겨 담고..

 

추가 삭제 관련

boolean add(Object o) - Obejct o 추가

boolean addAll(Collection c) - Collection c에 있는 내용 전부 추가(합집합)

boolean remove(Obejct o) - Obejct o 삭제

boolean removeAll(Collectioin c) - 컬렉션 c에 있는 것들 삭제(교집합)

boolean retainAll(Collection c) - 조건부 삭제. Collection c에 있는 것만 남기고 다 지우기.(차집합 구할 때 씀)

void clear() - 전부 삭제

 

조회 및 확인용

boolean contains(Obejct o) - Object o 있음?

boolean containsAll(Collection c) - 컬렉션에 담긴 데이터들 다 있음?

Iterator iterator() - Collection 객체 조회를 위한 Iterator 호출

 

boolean isEmpty() - 비었냐?

int size() - 객체 몇 개나 담겼냐?

Obejct[] toArray() - 배열객체로 바꿔줘

Obejct[] toArray(Object[] a) -

 

public class HashSet_ {
    public static void main(String[] args) {
        Object[] objects = {"1", new Integer(1), "2", "3", "3", "4", "4", "5", "6"};
        HashSet hashSet = new HashSet();

        // object[] 의 요소들을 HashSet에 하나씩 저장
        for (int i = 0; i < objects.length; i++) {
            hashSet.add(objects[i]);
        }
        // HashSet 요소들 출력
        System.out.println(hashSet);

        // HashSet에 저장된 요소들 출력(Iterator 사용)
        Iterator iterator = hashSet.iterator();

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

출력 결과는

1,1,2,3,4,5,6 이다.

Set이라 중복값을 허용하지 않기 때문이다.

..그런데 왜 1이 2개일까?

첫 번째 1은 문자열이다. - "1"

두 번째 1은 Integer 객체이다. - Integer

둘은 다른 객체이다.

 

재밌는 사실

1,1,2,3,4,5,6 에서 어떤 1이 문자열이고 어떤 1이 Integer인지 알 수 없다. ㅋ

Object[] objects = {"1", new Integer(1), "11", "2", "3", "3", "4", "4", "5", "6"};

로 중간에 11 넣었을 때의 출력 결과값은 아래와 같다. 일반적은 Set은 순서 보장 X

[11, 1, 1, 2, 3, 4, 5, 6]
11
1
1
2
3
4
5
6

하나 더, 이번엔 로또 생성기를 만들어 보자.

public class HashSet_2 {
    public static void main(String[] args) {
        Set set = new HashSet();

        // set의 크기가 6보다 작은 동안 1~45 사이의 난수 저장
        // = 로또 생성기
        for (int i = 0; set.size() < 6; i++) {
            int num = (int) (Math.random() * 45) + 1;
            set.add(num);
        }
        List list = new ArrayList(set);
        Collections.sort(list);
        System.out.println(list);
    }
}

HashSet 공부중인데 list는 왜 나올까?

1. set은 순서 보장이 되지 않는다.

2. 1,45, 42, 23, 44, 35 이런 식으로 출력되면 보기 불편하다.

3.  Collections 를 통해 정렬(sort) 가 가능한데, sort()의 인자로 넣을 수 있는 것은 List 타입이다. 

4. 그래서 굳이 List를 통해 정렬하고 출력 해보았다.

 

참조자료

https://www.youtube.com/watch?v=JYcFX4O2kqM&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=128