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源码
- java集合系列13 Set
- Java 集合系列15之 Set架构
- Java 集合系列15之 Set架构
- java集合框架系列---Set接口
- 疯狂Java系列之Set集合
- Java 集合系列15之 Set架构
- Java 集合系列15之 Set架构
- java集合---set集合
- JAVA集合-Set集合
- Java集合----Set集合
- Java集合类系列4--List,Set和Map
- Java集合之Set集合
- Java集合--Set集合总结
- Java集合之Set集合
- Java集合—Set集合
- java集合Set操作
- java集合----------Set
- JAVA集合之SET
- 线性表之链表
- 漫步数理统计二十六——多元正态分布
- chmod权限
- 深入理解Java:注解(Annotation)基本概念
- 用EasyX图形库VS2012的控制台的二维图形的绘制(仅限C++)
- java集合系列13 Set
- UGUI画布(Canvas)组件参数踩坑
- python 多线程
- mysql 创建索引
- CodeForces 735 A.Ostap and Grasshopper(水~)
- FMDB基础(oc操作sqlite)
- ARM基础学习-协处理器CP15
- stm32 不断的重新启动的原因
- vs2010--fatal error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突——我的解决方案