728x90

HashSet : 중복해서 저장하지 않는 집합(Set)으로 사용할 수 있는 클래스

HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인한다.

같은 객체가 없으면 저장하고, 있으면 저장하지 않는다.

import java.util.HashSet;
import java.util.Iterator;
import java.util.Objects;
 
public class HashSetEX {
    public static void main(String[] args) {
        HashSet set = new HashSet();
 
        // HashSet은 객체를 저장하기전에 기존에 같은 객체가 있는지 확인한다.
        // 같은 객체가 없으면 저장하고, 있으면 저장하지 않는다.
        set.add("abc");
        set.add("abc");
 
        // boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출
        // equals()와 hashCode()가 오버라이딩 되어 있어야 한다.
        set.add(new PerSon("홍길동",33));
        set.add(new PerSon("이순신",35));
        set.add(new PerSon("홍길동",33));
 
        System.out.println(set);
 
        // Iterator : 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것
        Iterator iterator = set.iterator(); // 값을 꺼내는 메소드를 이용한다.
        while (iterator.hasNext()) { // 읽어올 요소가 남아 있는가?
            System.out.println(iterator.next()); // 다음 요소를 읽어온다.
        }
        // HashSet는 데이터에 순서가 없기 때문에 데이터를 순서대로 읽어오거나,
        // 특정 위치의 데이터를 읽어올 수 있는 방법이 없기 때문에
        // "Iterator" 메소드를 활용해서 집합에 있는 "전체" 데이터를 불러올 수 있다.
    }
 
}
 
// equals()와 hashCode()를 오버라이딩해야 HashSet이 바르게 동작한다.
class PerSon {
    String name;
    int age;
 
    public PerSon(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public String toString() {
        return name + ":" + age;
    }
 
    @Override
    public int hashCode() {
        // int hash(Object... values); // 가변인자
        return Objects.hash(name,age);
        // 동일 객체에 대해 hashCode()를 여러 번 호출해도 동일한 값을 반환해야 한다.
    }
 
    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof PerSon)) return false;
 
        PerSon p = (PerSon) obj;
        // 나 자신(this)의 이름과 나이를 p와 비교
        return this.name.equals(p.name) && this.age == p.age;
        // equals()로 비교해서 true를 얻은 두 객체의 hashCode()값은 일치해야 한다.
    }
 
}
 

 

 

실행결과

 

블로그 이미지

Link2Me

,