Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

HashSet 2 본문

Java/JAVA2

HashSet 2

빌드이너프 2023. 7. 17. 21:46

HashSet

객체를 저장하기 전에 기존에 같은 객체가 있는지 확인(순서를 유지하지 않고, 중복을 허용하지 않기 때문)

boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출(equals()와 hashCode()가 오버라이딩 되어 있어야한다)

class Person {
    String name;
    int age;
    
    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String toString() {
        return name + ":" + age;
    }
}

 

public boolean equals(Object obj) {
    if(!(obj instanceof Person)) return false;
    
    Person tmp = (Person)obj;
    
    return name.equals(tmp.name) && age == tmp.age;
}

public int hashCode() {
    return (name+age).hashCode();
}

 

코드

import java.util.*;

public class HashSetTest3 {
    public static void main(String[] args) {
        HashSet set = new HashSet();

        set.add("abc");
        set.add("abc"); // 중복이기 때문에 저장안됨
        set.add(new PersonHash("David",10));
        set.add(new PersonHash("David",10));

        System.out.println(set);
    }
}

// equals()와 hashCode()를 오버라이딩해야 HashSet이 바르게 동작
class PersonHash {
    String name;
    int age;

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

    public String toString() {
        return name +":"+ age;
    }
}

[David:10, abc, David:10]

 

hashCode와 equals를 오버라이딩 했기 때문에 set.add(new PersonHash("David,10))이 중복으로 되었다

import java.util.*;

public class HashSetTest3 {
    public static void main(String[] args) {
        HashSet set = new HashSet();

        set.add("abc");
        set.add("abc"); // 중복이기 때문에 저장안됨
        set.add(new PersonHash("David",10));
        set.add(new PersonHash("David",10));

        System.out.println(set);
    }
}

// equals()와 hashCode()를 오버라이딩해야 HashSet이 바르게 동작
class PersonHash {
    String name;
    int age;

    @Override
    public int hashCode() {
        // int hash(Object... values); // 가변인자
        return Objects.hash(name,age);
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof PersonHash)) return false;

        PersonHash p = (PersonHash) obj;
        // 나자신(this)의 이름과 나이를 p와 비교
        return this.name.equals(p.name) && this.age==p.age;
    }

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

    public String toString() {
        return name +":"+ age;
    }
}

[David:10, abc]

'Java > JAVA2' 카테고리의 다른 글

TreeSet의 주요 생성자와 메서드  (0) 2023.07.23
TreeSet  (0) 2023.07.19
HashSet 1  (0) 2023.07.16
Arrays  (0) 2023.07.14
Iterator, ListIterator, Enumeration | Map과 Iterator  (0) 2023.07.13