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()값은 일치해야 한다.
}
}
|
실행결과
728x90
'안드로이드 > Java 문법' 카테고리의 다른 글
[Java] HashSet 를 이용한 ArrayList 중복제거 및 정렬 (0) | 2020.12.12 |
---|---|
[Java] HashSet 를 이용한 ArrayList 중복제거 및 단순 정렬 (0) | 2020.12.12 |
Java 와 C/C++ 비교 (0) | 2020.11.08 |
[Java] 람다식(Lambda Expression) (0) | 2020.07.26 |
[Java] 다형성 : 참조변수 형변환, 매개변수 다형성 (0) | 2020.07.08 |