[Day 7 | Java] Set

y♡ding·2024년 10월 22일
0

데브코스 TIL

목록 보기
37/163

HashSet은 자바 컬렉션 프레임워크에서 제공하는 Set 인터페이스를 구현한 클래스 중 하나로, 중복된 요소를 허용하지 않고 순서가 없는 데이터 집합을 관리하는 자료구조입니다.

1. HashSet의 특징

  • 중복을 허용하지 않음: 동일한 값이 두 번 이상 저장되지 않습니다. 즉, 중복 요소는 자동으로 제거됩니다.
  • 순서가 없음: HashSet에 저장된 요소들은 저장된 순서대로 출력되지 않습니다. 순서가 중요한 경우에는 LinkedHashSet이나 TreeSet을 사용하는 것이 좋습니다.
  • 빠른 접근 속도: 내부적으로 해시맵(HashMap)을 사용하기 때문에 검색, 삽입, 삭제 등의 연산이 빠르게 수행됩니다. (평균적으로 O(1) 성능)
  • null 값 허용: 단, HashSet은 한 개의 null 값만을 저장할 수 있습니다.

package com.util1;

import java.util.HashSet;

public class HashSetEx01 {
    public static void main(String[] args) {
        // HashSet 생성 (제네릭으로 String 타입만 허용)
        HashSet<String> set = new HashSet<>();

        // 요소 추가 (add 메서드 사용)
        set.add("홍길동");
        set.add("박문수");
        set.add("임꺽정");
        set.add("홍길동");  // 중복된 값은 무시됨

        // HashSet 출력 (저장 순서는 보장되지 않음)
        System.out.println(set);  // 출력: [임꺽정, 박문수, 홍길동]
    }
}

HashSet에서 equals()hashCode()의 역할

HashSet이 객체를 저장할 때, 먼저 객체의 해시 코드를 계산해서 같은 해시 코드가 있는지 확인합니다. 만약 같은 해시 코드를 가진 객체가 이미 존재한다면, HashSetequals() 메서드를 사용하여 실제 내용이 동일한지 확인합니다. 내용이 동일하면 중복된 객체로 간주하고 저장하지 않습니다.


equals()hashCode()의 동작 원리

  1. 해시 코드를 비교: 새로운 객체가 HashSet에 추가될 때, 먼저 객체의 해시 코드를 확인합니다. 같은 해시 코드를 가진 객체가 이미 있다면, 중복될 가능성이 있다고 판단합니다.
  2. equals()로 비교: 같은 해시 코드를 가진 객체가 있다면, equals() 메서드를 통해 실제로 같은 객체인지를 확인합니다. equals() 결과가 true중복된 객체로 처리되어 저장되지 않습니다.
  3. 중복된 객체 거부: equals() 메서드에 의해 같은 객체로 판단된 경우, HashSet은 해당 객체를 저장하지 않습니다.

수업코드


package com.util1;

import java.util.Objects;

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    // 내용값을 비교 : HashSet에서
    @Override
    public boolean equals(Object o) {
        System.out.println("Person.equals 메서드 호출");
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }    @Override
    public int hashCode() {
        System.out.println("Person.hashCode 메서드 호출");
        return Objects.hash(name, age);
    }
}

package com.util1;

import java.util.HashSet;

public class HashSetEx02 {
    public static void main(String[] args) {
        Person p1 = new Person("홍길동", 31);
        Person p2 = new Person("박문수", 33);
        Person p3 = new Person("임꺽정", 35);

        HashSet<Person> set = new HashSet<>();
        set.add(p1);  // 중복 아님 추가됨
        set.add(p2); // 중복 아님 추가됨
        set.add(p3); // 중복 아님 추가됨

        System.out.println(set);

        Person p4 = new Person("홍길동", 31);
        set.add(p4);  // 중복된 객체, 추가되지 않음

        // HashSet 출력 (중복된 객체는 추가되지 않음)
        System.out.println(set);

    }
}

0개의 댓글

관련 채용 정보