개발 일지/Java

[Java] Set<E>

미숫가루설탕많이 2023. 1. 4. 18:11

 Set 인터페이스를 구현한 모든 Set 컬렉션 클래스는 다음과 같은 특징을 가진다.

 

  • 요소의 저장 순서를 유지하지 않는다.
  • 같은 요소의 중복 저장을 허용하지 않는다.

 

 대표적인 Set을 구현한 클래스는 HashSet, TreeSet이 있다.

 

 

 

 

HashSet


 HashSet은 Set 인터페이스를 구현한 가장 대표적인 컬렉션 클래스 중 하나이며, 알고리즘(hash algorithm)을 사용하여 검색 속도가 매우 빠르다는 장점이 있다. 역시 Set 인터페이스의 특성을 그대로 물려받기 때문에 중복된 값을 허용하지 않으며, 저장 순서를 유지하지 않는다.

 

 다음은 HashSet에 값을 추가할 때 해당 값이 중복된 값인지 판단하는 과정이다.

 

  1. add(Object o)를 통해 객체를 저장하고자 한다.

  2. 이 때, 저장하고자 하는 객체의 해시코드를 hashCode() 메서드를 통해 얻는다.

  3. Set이 저장하고 있는 모든 객체들의 해시코드를 hashCode() 메서드로 얻는다.

  4. 저장하고자 하는 객체의 해시코드와 Set에 이미 저장되어져 있던 객체들의 해시코드를 비교해서 같은 해시코드가 있는지 검사한다.
    • 만약 같은 해시코드를 가진 객체가 존재하면 아래 5번으로 넘어간다.
    • 같은 해시코드를 가진 객체가 존재하지 않으면 Set에 객체가 추가되며 abb(Object o) 메서드가 true를 리턴한다.

  5. equals() 메서드를 통해 객체를 비교한다.
    • true가 리턴된다면 중복 객체로 간주되어 Set에 추가되지 않고 add(Object o) 메서드가 false를 리턴한다.
    • false가 리턴되면 Set에 객체가 추가되고 add(Object o) 메서드가 true를 리턴한다.

 

HashSet<String > languages = new HashSet<String>();

languages.add("Java");
languages.add("Python");
languages.add("Javascript");
languages.add("C++");
languages.add("Kotlin");
languages.add("Ruby");
languages.add("Java");

Iterator it = languages.iterator();

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

 

 위 코드를 실행시켜보면 아래와 같이 입력한 순서대로 출력되지 않고 "Java"는 한 번만 저장된 것을 확인할 수 있다.

 

 

 

 

 

TreeSet


 TreeSet 클래스는 데이터가 정렬된 상태로 저장되는 이진 검색 트리(binary search tree)의 형태로 요소를 저장하고 역시나 Set 인터페이스의 특징은 그대로 유지된다.

 

 이진 검색 트리는 데이터를 추가하거나 제거하는 등의 기본 동작 시간이 매우 빠르다.

 

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

        languages.add("Java");
        languages.add("Python");
        languages.add("C++");

        System.out.println(languages);
        System.out.println(languages.first());
        System.out.println(languages.last());
        System.out.println(languages.higher("Java"));
        System.out.println(languages.subSet("C++", "Python"));
    }

 

 위 코드의 출력값을 확인해보면 요소를 추가하기만 했음에도 불구하고, 자동으로 사전 편찬 순에 따라서 오름차순으로 정렬됨을 확인할 수 있다. 이는 TreeSet의 기본 정렬 방식이 오름차순이기 때문이다.

'개발 일지 > Java' 카테고리의 다른 글

[Java] 반복자(Iterator)  (0) 2023.01.04
[Java] Map<K, V>  (1) 2023.01.04
[Java] List<E>  (0) 2023.01.04
[Java] 컬렉션 프레임워크(Collection Framework)  (0) 2023.01.04
[Java] 예외 처리(Exception Handling)  (0) 2023.01.04