容器(十):Collection三足鼎立之Set

容器(十):Collection三足鼎立之Set

标签: Java编程思想

  • 容器十Collection三足鼎立之Set
    • Set接口简介
    • Set源码分析
    • 总结


Set接口简介

public interface Set extends Collection

Set是Collection家族中的一份子,它的概念类似于数学中的“集合”,它与List的区别就是:Set不包含重复元素的集合。

当对Set中添加相同的元素的时候,后面的这个不能添加进去。

那么这里就要进行一个说明:如何判断“相同元素”?

我们可以这样说:Set中不包含一对元素e1和e2 ,使得e1.equals(e2) ,并且最多一个空元素。当向Set中添加相同的元素的时候,后面的这个不能添加进去。这就要求我们,对于自定义的类型,一定要重写写equals()方法和hashCode()方法

这是因为:Set中的元素通过判断哈希值来存储,首先调用此对象所在类的hashCode方法,计算此对象的哈希值,此哈希值决定了此对象在Set中的存储位置。若此位置之前的没有对象存储,则这个对象直接存到此位置。若此位置已有对象存储,再通过equals()比较这两个对象是否相同,如果相同,后一个对象就不能再添加进来。

Set源码分析

其实我们可以看到Set作为一个接口,没有方法的具体实现,而且大部分方法都是继承自Collection的

package java.util;

public interface Set<E> extends Collection<E> {
    int size();

    boolean isEmpty();

    boolean contains(Object o);

    Iterator iterator();

    Object[] toArray();

     T[] toArray(T[] a);

    boolean add(E e);

    boolean remove(Object o);

    boolean containsAll(Collection c);


    boolean addAll(Collection c);

    boolean retainAll(Collection c);

    boolean removeAll(Collection c);

    void clear();

    boolean equals(Object o);

    int hashCode();

    default Spliterator spliterator() {
        return Spliterators.spliterator(this, Spliterator.DISTINCT);
    }
}

总结

  • Set 是继承于Collection的接口。它是一个不允许有重复元素的集合。
  • AbstractSet 是一个抽象类,它继承于AbstractCollection,AbstractCollection实现了Set中的绝大部分函数,为Set的实现类提供了便利。
  • HashSet 和 TreeSet 是Set的两个实现类。其中HashSet是主实现类
    • HashSet是依赖于HashMap,它实际上是通过HashMap实现的。HashSet中的元素是无序的。
    • TreeSet依赖于TreeMap,它实际上是通过TreeMap实现的。TreeSet中的元素是有序的。

ps:用心学习,喜欢的话请点赞 (在左侧哦)

你可能感兴趣的:(手撸源码,Java集合,手撸源码:java集合)