HashSet이란
Hashset은 Set인터페이스를 구현한 가장 대표적인 컬렉션이다.
Set은 비선형 구조이기 때문에 '순서'의 개념과 '인덱스'가 존재하지 않는다.
때문에 값을 추가 / 삭제 하는 경우 Set 내부에 해당 값을 검색하여 해당 기능을 수행해야 한다.
이로 인해 처리 속도가 List구조에 느리다는 것이 단점이다.
HashSet의 특징
중복된 요소를 저장하지 않는다.
순서 없이 저장된다.
null을 허용한다.
HashSet
public class HashSetTest {
public static void main(String[] args) {
HashSet<Object> set = new HashSet<>();
System.out.println("add1 = " + set.add(1));
System.out.println("add2 = " + set.add(5));
System.out.println("add3 = " + set.add(3));
System.out.println("add4 = " + set.add(4));
System.out.println("add5 = " + set.add(4));
System.out.println("add6 = " + set.add("4"));
System.out.println("add6 = " + set.add(null));
System.out.println("set = " + set);
}
}
위코드를 실행시키면
add1 = true
add2 = true
add3 = true
add4 = true
add5 = true
add6 = false
add7 = true
set = [null, 1, 3, 3, 4, 5]
위와같이 나올것이다.
3이 두번 출력된 이유는 하나는 Integer인스턴스이고 String 인스턴스형으로 서로다른 객체이므로 중복으로 간주하지 않기때문다.
4를 두번 등록 하였기 때문에 add6 = false가 출력 되었다.
또한 null이 저장되는것을 볼수 있다.
참고
만일 중복을 제거하는 동시에 저장한 순서를 유지하고자 한다면 HashSet 대신 LinkedHashSet을 사용하여야 한다.
HashSet - 사용자 정의 Class
public class Fruit {
@Override
public String toString() {
return "Fruit{" +
"id=" + id +
", price=" + price +
'}';
}
private final int id;
private final int price;
public Fruit(int id, int price) {
this.id = id;
this.price = price;
}
}
public class HashSetClass {
public static void main(String[] args) {
HashSet<Fruit> set = new HashSet<>();
System.out.println("add1 = " + set.add(new Fruit(1, 10000)));
System.out.println("add2 = " + set.add(new Fruit(1, 10000)));
System.out.println("set = " + set);
}
}
Fruit 클래스는 id와 price를 멤버변수로 갖는다. id와 price가 같으면 같은 객체로 인식하도록 하려는 의도로 작성하였다.
위 코드를 실행 시켜 보자.
add1 = true
add2 = true
set = [Fruit{id=1, price=10000}, Fruit{id=1, price=10000}]
위와같이 결과가 나오는데, 분명 id, price가 같은값임에도 불구하고 서로 다른 것으로 인식하여 Fruit{id=1, price=10000}이 두번 출력되었다. 클래스의 작성의도대로 이 두 인스턴스를 같은 것으로 인식하게 하려면 어떻게 해야 하는걸까?
답은 Equals와 hashCode를 오버라이딩 하는 것이다.
References
Java의 정석, 남궁 성 지음
'Java' 카테고리의 다른 글
| 날짜와 시간 - LocalDateTime, ZonedDateTIme (0) | 2023.09.11 |
|---|---|
| 제네릭스 (0) | 2023.09.06 |
| Java Collection Set (0) | 2023.08.24 |
| Java Collection Map (0) | 2023.08.24 |
| Comparator와 Comparable (0) | 2023.08.24 |