본문 바로가기

개발

Java - HashSet

반응형

HashSet - 순서 X 중복 X
 - Set인터페이스를 구현한 대표적인 컬렉션 클래스 
 - 순서를 유지하려면 LinkedHashSet 사용

TreeSet 
 - 범위검색과 정렬에 유리한 컬렉션 클래스 
 - HashSet보다 데이터 추가, 삭제에 시간이 더 걸림

HashSet 메서드 
 - HashSet()
    HashSet(Collection c)
    HashSet(int initialCapacity)
    HashSet(int initialCapacity, float loadFactory) : loadFactory이 0.8 일때 80퍼센트 차면 용량 두배 증가 
 - boolean add(Object o) / boolean addAll(Collection c) : 추가 
 - boolean remove(Object o) / boolean removeAll(Collection c) : 삭제 
 - boolean retainAll(Collection c) : 지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 Collection에서 삭제한다. 
    이 작업으로 변화가 있으면 true 없으면 false를 리턴한다. 
 - void clear() : 모든 객체를 삭제 
 - boolean contains(Object o) / boolean containsAll(Collection c) : 지정된 객체(o) 또는 Collection의 객체들이 Collection에 포함되어 있는지 확인한다.
 - boolean isEmpty() : 비여있는지 확인 
 - int size() : Collection에 저장된 객체의 수를 반환한다.
 - Object[] toArray() : 객체 배열을 반환
 - Object[] toArray(Object[] a) 
 - Iterator iterator()



HashSet은 저장하기 전에 기존에 같은 객체가 있는지 확인을 해야한다. 
boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출하여 확인 한다. 
그렇기 때문에 객체에 equals()와 hashCode()가 오버라이딩 되어 있어야 한다.

package collection.hashset;

import java.util.*;

public class HashSetMain {
    public static void main(String [] args) {
        Set set = new HashSet<Student>();
        set.add(new Student("A", 20, 30));
        set.add(new Student("B", 40, 50));
        set.add(new Student("B", 40, 50));
        set.add(new Student("C", 30, 30));

        Iterator it = set.iterator();
        while(it.hasNext()){
            System.out.println(it.next().toString());
        }
    }
}

class Student {
    String name;
    int math;
    int science;

    Student(String name, int math, int science){
        this.name = name;
        this.math = math;
        this.science = science;
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, math, science);
    }

    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof Student)){
            return false;
        }
        Student s = (Student)obj;

        return this.name.equals(s.name) && this.math == s.math && this.science == s.science;
    }

    @Override
    public String toString() {
        return this.name + " : " + this.math + " : " + this.science;
    }
}

실행결과 

반응형

'개발' 카테고리의 다른 글

Java - HashMap과 Hashtable  (0) 2021.06.06
Java - TreeSet  (0) 2021.06.06
Java - Comparator와 Comparable  (0) 2021.06.06
Java - Arrays  (0) 2021.06.06
Java - 스택과 큐 (Stack & Queue)  (0) 2021.06.06