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

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

标签: Java编程思想


Set接口简介

public interface Set<E> extends Collection<E>

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<E> iterator();

    Object[] toArray();

    <T> T[] toArray(T[] a);

    boolean add(E e);

    boolean remove(Object o);

    boolean containsAll(Collection<?> c);


    boolean addAll(Collection<? extends E> c);

    boolean retainAll(Collection<?> c);

    boolean removeAll(Collection<?> c);

    void clear();

    boolean equals(Object o);

    int hashCode();

    default Spliterator<E> 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:用心学习,喜欢的话请点赞 (在左侧哦)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值