java集合系列13 Set

来源:互联网 发布:c语言语言 编辑:程序博客网 时间:2024/06/06 15:47

前言

在介绍完Map接口后,本来想着介绍AbstractMap的,但AbstractMap,又依赖了Set接口,所以我们还是先来看看Set接口吧

Set架构
这里写图片描述

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

Set接口文档

一个不包涵重复元素的集合。通常来讲,set不包含满足e1.equals(e2)的元素对,并且至多包含一个null元素。正如其名字暗示的,此接口模仿了数学上的set抽象。

在所有构造方法以及 add、equals 和 hashCode 方法的协定上,Set 接口还加入了其他规定,这些规定超出了从 Collection 接口所继承的内容。出于方便考虑,它还包括了其他继承方法的声明(这些声明的规范已经专门针对 Set 接口进行了修改,但是没有包含任何其他的规定)。

对于构造器额外的协定是(不要吃惊):所有的构造器必须创建一个不包含重复元素的set(像上面定义的那样)

注:如果将可变对象用作 set 元素,那么必须极其小心。如果对象是 set 中某个元素,以一种影响 equals 比较的方式改变对象的值,那么 set 的行为就是不确定的。此项禁止的一个特殊情况是不允许某个 set 包含其自身作为元素。

某些 set 实现对其所包含的元素有所限制。例如,某些实现禁止 null 元素,而某些则对其元素的类型所有限制。试图添加不合格的元素会抛出未经检查的异常,通常是 NullPointerException 或 ClassCastException。试图查询不合格的元素是否存在可能会抛出异常,也可能简单地返回 false;某些实现会采用前一种行为,而某些则采用后者。概括地说,试图对不合格元素执行操作时,如果完成该操作后不会导致在 set 中插入不合格的元素,则该操作可能抛出一个异常,也可能成功,这取决于实现的选择。此接口的规范中将这样的异常标记为“可选”。

源码

public interface Set2<E> extends Collection<E> {    /**     * 返回此set中的元素数(其基本)。     * 如果此集合包含的元素超过Integer.MAX_VALUE,     * 返回Integer.MAX_VALUE     */    int size();    /**     * 如果此不包含任何元素返回true     * @return     */    boolean isEmpty();    /**     * 如果此集合包含指定的元素返回true。     * 通常来讲,当且仅当此set包含一个(o == null ? e == null : o.equals(e))的元素e时,返回true     */    boolean contains(Object o);    /**     * 返回在此set中的元素上进行迭代的迭代器。     * 返回的元素没有特定的顺序(除非此set是某个提供顺序保证的类的实例)     * @return     */    Iterator<E> iterator();    /**     * 返回一个包含此set中所有元素的数组。     * 如果此set对其迭代器返回的元素的顺序作出了保证     * 则此方法必须以相同的顺序返回元素     *     * 由于此set不维护对返回数组的任何引用,因此返回的数组是安全的。     * (换句说,此方法必须重新分一个新的数组,即使受一个数组支持)。     *     * 调用者因此可以随意更改返回的数组     *     * 此方法作为基于数组和集合API之间的桥梁     * @return     */    Object[] toArray();    /**     * 返回一个包含此set中所有元素的数组;     * 返回数组的运行时类型是指定数组的类型。     * 如果指定的数组能容纳set,则它将在其中返回。     * 否则,会重新分配一个与指定数组类型相同并且具有与set元素个数大小的新数组     *     * 如果指定的数组能容纳此set,并有剩余的空间(即该数组的元素比此set多),那么会将列表中紧接该set尾部设置为null     * (只有调用者知道此set不包含任何null元素时,才能以此特性判断set的长度)     *     * 如果此set对其迭代器返回的元素顺序作出了保证,则此方法以相同的顺序返回这些元素     *     * 像 toArray() 方法一样,此方法充当基于数组的 API 与基于 collection 的 API 之间的桥梁。     * 更进一步说,此方法允许对输出数组的运行时类型上进行精确控制,在某些情况下,可以用来节省分配开销。     *     * 假定 x 是只包含字符串的一个已知 set。以下代码用来将该 set 转储到一个新分配的 String 数组:     *     * String[] y = x.toArray(new String[0]);     * 注意, toArray(new Object[0]) 和 toArray() 在功能上是相同的。     */    <T> T[] toArray(T[] a);    /**     * 添加指定的元素到此set,如果此set不存在此元素(可选的操作)     * 更直白的说,添加指定的元素e到此set,如果此set不包含像这样的元素e2     * (e == null ? e2 == null : e.equals(e2))     * 如果此set已经包含该元素,则该调用不改变此set并返回false。     * 结合构造方法上的限制,这确保了set永远不包含重复的元素。     *     * 上述规定并未暗示set必须接受所有元素;     * set可以拒绝添加任意特定的元素,包括null,并抛出异常,     * 这与Collection.add规范中所描述的一样。每个set实现应该明确地记录对     * 其可以包含元素的所有限制     */    boolean add(E e);    /**     * 从set中删除指定的元素,如果set中存在这样的元素(可选的操作)     * 更直白的讲,删除像这样的元素e     * (o == null ? e == null : o.equals(e)),     * 如果此集合包含这样的元素。(或者此set由于调用而发生更改),     * 则返回true(一更调用返回,此set将不再包含指定的元素)     */    boolean remove(Object o);}//大数量的操作 /**     * 如果此set包含指定集合的所有元素,返回true。     * 如果指定的集合也是一个set,如果指定集合是此集合的一个子集返回true     */    boolean containsAll(Collection<?> c);    /**     * 把指定集合的元素添加到此set中,如果元素在set中不存在。(可选的操作)     * 如果指定的集合也是一个set,addAll操作相当于两个set的并集     */    boolean addAll(Collection<? extends E> c);    /**     * 求此set与指定集合的交集(可选的操作)     */    boolean retainAll(Collection<?> c);    /**     * 删除此集合中并且也在指定集合中的元素(可选的操作)     * @param c     * @return     */    boolean removeAll(Collection<?> c);    /**     * 清空此set(可选的操作)     * 此方法返回后,此set将会为空     */    void clear();    boolean equals(Object o);    int hashCode();

参考

Java 集合系列15之 Set架构
JDK1.8源码

0 0
原创粉丝点击