Java 集合之Set接口
-
不包含重复元素的集合。 更确切地讲,set 不包含一对
e1.equals(e2)
的元素 e1 和 e2,并且最多包含一个空元素。 正如其名称所暗示的那样,此接口模仿了数学上的 set 抽象。 -
除了从 Collection 接口继承的那些之外,Set 接口对所有构造函数的协定以及 add、equals 和 hashCode 方法的协定进行了额外的规定。 为方便起见,此处还包括其他继承方法的声明。 (这些声明附带的规范已针对 Set 接口量身定制,但它们不包含任何附加规定。)
-
对构造函数的附加规定:所有构造函数都必须创建一个不包含重复元素的集合(如上文所定义)。
-
注意:如果将可变对象用作 set 元素,则必须非常小心。 如果对象的值以影响
equals
比较的方式更改,而对象是集合中的元素,则不会指定集合的行为。 此禁止的一个特殊情况是不允许 set 将自身包含为元素。 -
某些 set 实现对其所包含的元素有所限制。例如,某些实现禁止 null 元素,而某些则对其元素的类型所有限制。
- 试图添加不合格的元素会抛出未经检查的异常,通常是
NullPointerException
或ClassCastException
。 - 试图查询不合格的元素是否存在可能会抛出异常,也可能简单地返回 false。
- 概括地说,试图对不合格元素执行操作时,如果完成该操作后不会导致在 set 中插入不合格的元素,则该操作可能抛出一个异常,也可能成功,这取决于实现的选择。此接口的规范中将这样的异常标记为“可选”。
- 试图添加不合格的元素会抛出未经检查的异常,通常是
-
不可修改的集合 Set.of (JDK9新增)和 Set.copyOf (JDK10新增)静态工厂方法提供了一种创建不可修改的集合的便捷方法。 这些方法创建的 Set 实例具有以下特点:
- 它们是不可修改的。 不能添加或删除元素。 调用 Set 上的任何 mutator 方法将始终导致抛出 UnsupportedOperationException。 但是,如果包含的元素本身是可变的,这可能会导致 Set 的行为不一致或它的内容似乎发生了变化。
- 它们不允许空元素。 尝试使用空元素创建它们会导致 NullPointerException。
- 如果所有元素都可序列化,则它们是可序列化的。
- 他们在创建时拒绝重复的元素。 传递给静态工厂方法的重复元素会导致 IllegalArgumentException。
- 集合元素的迭代顺序未指定并且可能会发生变化。
- 它们是基于价值的。 程序员应将相等的实例视为可互换的,不应将它们用于同步,否则可能会出现不可预测的行为。 例如,在未来的版本中,同步可能会失败。 调用者不应假设返回实例的身份。 工厂可以自由创建新实例或重用现有实例。
- 它们按照“序列化表单”页面上的指定进行序列化。
方法
没有与索引相关的方法,故而想要遍历set需使用迭代器
Modifier and Type | Method | Description |
---|---|---|
boolean | add (E e) | 如果指定元素尚不存在,则将其添加到此集合中(可选操作)。 |
boolean | addAll (Collection<? extends E> c) | 如果指定集合中的所有元素尚不存在,则将其添加到此集合中(可选操作)。 |
void | clear() | 从此集合中删除所有元素(可选操作)。 |
boolean | contains (Object o) | 如果此集合包含指定的元素,则返回 true。 |
boolean | containsAll (Collection<?> c) | 如果此集合包含指定集合的所有元素,则返回 true。 |
static Set | copyOf (Collection<? extends E> coll) | 返回一个不可修改的 Set,其中包含给定 Collection |
boolean | equals (Object o) | 比较指定的对象与此集合是否相等。 |
int | hashCode() | 返回此集合的哈希码值。 |
boolean | isEmpty() | 如果此集合不包含任何元素,则返回 true。 |
Iterator | iterator() | 返回此集合中元素的迭代器。 |
static Set | of() | 返回包含零个元素的不可修改set。 |
static Set | of(E… elements) | 返回包含任意数量元素的不可修改set。 |
static Set | of(E e1, E e2,) {1~10} |
返回包含1~10个(具体取决于定义的E ei 的个数)元素的不可修改set。 |
boolean | remove (Object o) | 如果指定元素存在,则从该集合中移除指定元素(可选操作)。 |
boolean | removeAll (Collection<?> c) | 从此集合中移除指定集合中包含的所有元素(可选操作)。 |
boolean | retainAll (Collection<?> c) | 仅保留此集合中包含在指定集合中的元素(可选操作)。 |
int | size() | 返回此集合中的元素数(其容量)。 |
default Spliterator | spliterator() | 在此集合中的元素上创建一个 Spliterator。 |
Object[] | toArray() | 返回一个包含此集合中所有元素的数组。 |
T[] | toArray (T[] a) | 返回一个包含该集合中所有元素的数组; 返回数组的运行时类型是指定数组的类型。 |
- 从 java.util.Collection接口继承的方法
parallelStream, removeIf, stream, toArray
- 从 java.lang.Iterable接口继承的方法
forEach