Set은 List와 다르게 데이터를 중복해서 저장할 수 없다.
저장된 객체를 인덱스로 관리하지 않기 때문에 저장 순서가 보장되지 않는다.
Set을 구현하는 대표적인 클래스는 HashSet, TreeSet, LinkedHashSet이 있다.
데이터를 중복 저장할 수 없고 순서를 보장하지 않는다.
내부적으로 HashMap을 갖고 있다.
데이터는 HashMap의 key로 저장한다.
HashMap의 value에 더미 객체를 넣는다.
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable
{
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
TreeSet은 중복된 데이터를 저장할 수 없고 입력한 순서대로 값을 저장하지 않는다.
대신 TreeSet은 기본적으로 오름차순으로 데이터를 정렬한다.
내부적으로 TreeMap을 갖고 있다.
데이터는 TreeMap을 key로 저장한다.
TreeMap을 value에 더미 객체를 넣는다.
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable
{
/**
* The backing map.
*/
private transient NavigableMap<E,Object> m;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
HashSet을 상속하며, HashSet 생성자 중 Map을 LinkedHashMap으로 정의하는 생성자를 사용한다.
HashSet과의 차이점은 내부 Map을 HashMap으로 선언했는지, LinkedHashMap으로 선언했는지의 차이다.
데이터는 LinkedHashMap으로 key로 저장한다.
LinkedHashMap value로는 더미 객체를 넣는다.
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
private static final long serialVersionUID = -2851667679971038690L;