Language/Java

8.3 Collection Framework - set 인터페이스

리져니 2021. 7. 20. 21:47

Set 인터페이스

중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션 클래스를 구현하는데 사용

 

HashSet

Set인터페이스를 구현한 가장 대표적인 컬렉션. 중복된 요소를 저장하지 않는다

새로운 요소를 추가할 때는 add()나 addAll()을 사용하는데, 만일 중복된 요소를 추가하고자 한다면 false값이 반환되어 실패했다는 것을 알리게된다.

저장순서를 유지하지 않으므로 만약 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야 한다

HashSet() HashSet객체를 생성
HashSet(Collection c) 주어진 컬렉션을 포함하는 HashSet객체 생성
HashSet(int capacity) 주어진 값을 초기 용량으로 하는 HashSet객체 생성
HashSet(int capacity, float loadFactor) 초기용량과 load factor를 지정하는 생성자
boolean add(Object o) 새로운 객체 저장
boolean addAll(Collection c) 주어진 컬렉션에 저장된 모든 객체들을 추가
void clear() 저장된 모든 객체를 삭제
Object clone() HashSet을 복제해서 반환 (얕은 복사)
boolean containsAll(Collection c) 지정된 객체를 포함하고 있는지 알림
boolean isEmpty() HashSet이 비어있는지 알림
Iterator iterator() iterator를 반환
boolean remove(Object o) 지정된 객체를 HashSet에서 삭제
boolean removeAll(Collection c) 주어진 컬렉션에 저장된 모든 객체와 동일한 것들을 HashSet에서 모두 삭제(차집합)
boolean retainAll(Collection c) 주어진 컬렉션에 저장된 객체와 동일한 것만 남기고 삭제(교집합)
int size() 저장된 객체의 개수 반환
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        Object[] objArr = {"1",1, "4","2","3","2","3","5"};
        Set set = new HashSet();

        for(int i=0;i< objArr.length;i++){
            set.add(objArr[i]);
        }

        System.out.println(set);

    }
}

실행 결과

* 중복 제거가 되었다

 

 

LinkedHashSet

중복된 요소를 저장하지 않으며, 저장순서를 유지한다.

import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        Set LinkedSet = new LinkedHashSet();

        LinkedSet.add(2);
        LinkedSet.add(2);
        LinkedSet.add(1);
        LinkedSet.add(10);
        LinkedSet.add(7);

        System.out.println(LinkedSet);

    }
}

실행 결과

 

TreeSet

이진 검색 트리의 형태로 데이터를 저장하는 컬렉션 클래스.

중복된 데이터의 저장을 허용하지 않으며, 정렬된 위치에 저장하므로 저장순서를 유지하지 않아도 된다.

(이진 검색 트리는 정렬, 검색, 범위검색에 높은 성능을 보이며 TreeSet은 이진 검색 트리의 성능을 향상시킨 레드-블랙 트리로 구현되어 있다)

 

이진 트리

링크드 리스트처럼 여러 개의 노드(node)가 서로 연결된 구조로, 각 노드에 최대 2개의 노드를 연결할수 있으며 루트(root)라고 불리는 하나의 노드에서 계속 확장해 나갈수 있다

class TreeNode{
	TreeNode left;	//왼쪽 자식노드
    Object element;	// 객체를 저장하기 위한 참조변수
    TreeNode Right;	// 오른쪽 자식노드
}

 

이진 탐색 트리

부모노드의 왼쪽에는 부모노드의 값보다 작은 값의 자식노드를, 오른쪽에는 큰 값의 자식노드를 저장하는 이진 트리

이진 탐색 트리 구조

첫번쨰로 저장되는 값은 루트가 되고, 두번째 값은 트리의 루트부터 시작해서 값의 크기를 비교하면서 트리를 따라 내려간다. 작은값은 왼쪽에, 큰값은 오른쪽에 저장하여 트리를 구성하면 왼쪽 마지막 레벨이 제일 작은 값이 되고 오른쪽 마지막 레벨의 값이 제일 큰 값이 된다.

 

<특징>

모든 노드는 최대 두개의 자식노드를 가질 수 있다(초과 할수 없음).

왼쪽 자식노드의 값은 부모노드의 값보다 작고, 오른쪽 자식노드의 값은 부모노드의 값보다 커야한다.

노드의 추가, 삭제에 시간이 걸린다(순차적으로 저장하지 않기때문)

검색과 정렬에 유리하다.

중복된 값을 저장하지 못한다.

 

 

728x90