ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Set 컬렉션
    언어/Java 2021. 1. 30. 17:25

    List 컬렉션은 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않습니다. 또한 객체를 중복 저장할 수 없고 null도 단 1개만 저장합니다.


    Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없습니다. 대신 전체 객체를 대상으로 한 번씩 반복해서 가져오는 Iterator를 제공합니다. Iterator에서 하나의 객체를 가져올 땐 next() 메소드를 사용합니다.

    Set<String> set = new HashSet<>();
    
    set.add("김");
    set.add("김"); // 중복
    set.add("이");
    set.add("박");
    // [김, 이, 박]
    
    Iterator<String> iterator = set.iterator();
    
    // 방법 1
    for (String str : set) {
        System.out.println(str);
    }
    
    // 방법 2
    while (iterator.hasNext()) {
        String str = iterator.next();
        System.out.println(str);
    
        if (str.equals("이"))
            iterator.remove(); // set 컬렉션에서 "이"를 제거함
    }
    
    // 위에서 이 를 제거해 [김, 박] 만 존재

    HashSet

    HashSet은 객체들을 순서없이 저장하고 동일한 객체는 중복 저장하지 않습니다. HashSet이 판단하는 동일한 객체란 같은 인스턴스를 의미하지 않습니다. 객체를 저장하기 전에 객체의 hashcode() 메소드를 호출해 해시코드 값을 얻고, 이미 저장되어 있는 객체들의 해시코드 값과 비교합니다. 만약 동일한 해시 코드가 있다면 다시 equals() 메소드로 두 객체를 비교해 true가 나오면 동일한 객체로 판단하고 저장하지 않습니다.

    문자열을 HashSet에 저장할 경우에 같은 문자열을 갖는 String 객체는 동등한 객체로 간주되고 다른 문자열을 갖는 String 객체는 다른 객체로 간주되는데 그 이유는 String 클래스가 hashcode()와 equals() 메소드를 재정의해서 같은 문자열일 경우 hashcode()의 리턴 값은 같게 나오고, equals()의 리턴 값은 true가 나오도록 했기 때문입니다.

    String a = "asd";
    String b = "asd";
    String c = "asd1";
    // a와 b의 해시코드값 동일
    System.out.println(a.hashCode() == b.hashCode()); // true
    System.out.println(a.equals(b)); // true
    // 해시코드 값 다름
    System.out.println(a.hashCode() == c.hashCode()); // false
    
    
    
    
    Set<Member> set = new HashSet<>();
    
    set.add(new Member("김", 100));
    set.add(new Member("김", 100)); // 인스턴스는 다르지만 내부 데이터가 같으므로 1개만 저장

    LinkedHashSet

    HashSet과 마찬가지로 중복 저장하지 않지만 다른 점으로는 입력된 순서대로 저장하고 관리합니다.

        Set<String> set = new LinkedHashSet<>();
        set.add("1");
        set.add("1");
        set.add("two");
        set.add("3");
        set.add("4");
        set.add("five");
    
        Iterator<String> iterator = set.iterator();
        // [1, two, 3, 4, five]
    
        while (iterator.hasNext()) {
            String s = iterator.next();
            System.out.println(s);
            if (s.equals("3"))
                iterator.remove();
        }
        // [1, two, 4, five]
    }

    TreeSet

    HashSet과 마찬가지로 중복 저장하지 않지만 다른 점으로는 오름차순으로 데이터를 저장하고 관리합니다.

    Set<String> set = new TreeSet<>();
    set.add("1");
    set.add("1");
    set.add("8");
    set.add("4");
    set.add("3");
    set.add("5");
    
    Iterator<String> iterator = set.iterator();
    // [1, 3, 4, 5, 8]
    
    while (iterator.hasNext()) {
        String s = iterator.next();
        System.out.println(s);
        if (s.equals("3"))
            iterator.remove();
    }
    // [1, 4, 5, 8]


    댓글