实现简单的集合Set

集合

Set:注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素。
用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。

特点

Java的Set接口继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两种实现。
在判断重复元素的时候,Set集合会调用hashCode()和equal()方法来实现。
TreeSet是红黑树结构,每一个元素都是树中的一个节点,插入的元素都会进行排序;

集合的接口定义

public interface CustomSet<E> {

    boolean add(E e);

    boolean remove(E e);

    boolean contains(Object o);

    int size();
}

基于HashSet的实现

jdk的源码中,HashSet底层的数据存取是通过HashMap实现的。了解HashMap之后,那么HashSet就非常容易。HashSet大部分的方法都是直接调用HashMap的方法就可以实现的。这种方法比较取巧,不过如何能手动实现HashSet,实现HashSet问题也不大。

CustomHashSet.java

public class CustomHashSet<E> implements CustomSet<E> {

    private HashMap<E, Object> map;

    static final Object PRECENT = new Object();

    public CustomHashSet() {
        this.map = new HashMap<>();
    }

    public CustomHashSet(int initialCapacity) {
        this.map = new HashMap<>(initialCapacity);
    }

    public CustomHashSet(int initialCapacity, float inithialLoadFactor) {
        this.map = new HashMap<>(initialCapacity, inithialLoadFactor);
    }

    /**
     * 如果已经存在此e这个key
     * 那么HashMap会返回非空的Object(PRECENT),add方法就会返回false
     * 注意,在HashMap的put方法中如果key相同,那么旧value会被新value取代,
     * 但原来的在HashMap中的key是不会有任何改变的,也就是说这符合HashSet不允许重复元素的要求
     */
    @Override
    public boolean add(E e) {
        return map.put(e, PRECENT) == null;
    }

    @Override
    public boolean remove(Object o) {
        return map.remove(o) == PRECENT;
    }

    @Override
    public boolean contains(Object o) {
        return map.containsKey(o);
    }

    @Override
    public int size() {
        return map.size();
    }

}

(完)

发表评论

邮箱地址不会被公开。 必填项已用*标注