Java中的AbstractSet类及其示例
Java中的AbstractSet类 是Java集合框架的一部分,实现了 Collection接口 并扩展了 AbstractCollection类 。它为Set接口提供了骨架实现。这个类没有覆盖AbstractCollection类中的任何实现,而是仅为equals()和hashCode()方法添加了实现。
通过扩展此类来实现集合的过程与通过扩展AbstractCollection来实现集合的过程相同,只是此类的子类中的所有方法和构造函数都必须遵守Set接口所施加的附加约束(例如,add方法不能允许将对象的多个实例添加到一个集合中)。

从类层次结构图中可以得出该类实现了 **Iterable
语法: 声明
public abstract class AbstractSet<E>
extends AbstractCollection<E>
implements Set<E>
其中 E 是此Set维护的元素类型。
AbstractSet的不同特征:
在Java中,AbstractSet类是一个实现Set接口的抽象类。AbstractSet的一些关键特征包括:
- 实现Set接口: AbstractSet实现Set接口,这意味着它提供了一组标准的方法来操作集。
- 实现一些Set方法: AbstractSet实现Set接口的一些方法,例如size(),isEmpty(),contains()和remove()。
- 支持迭代器: AbstractSet提供一个迭代器方法,它返回一个迭代器,用于遍历集合中的元素。
- 没有实现所有set方法: AbstractSet是一个抽象类,没有实现Set接口的所有方法。未实现的一些方法包括add()、addAll()和clear()。这些方法必须由AbstractSet的子类来实现。
- 提供默认实现: AbstractSet为Set接口的某些方法提供默认实现,可以根据需要由子类覆盖。
- 支持null元素: AbstractSet允许将null元素添加到集合中。
- 无序: AbstractSet是一个无序的集合,这意味着不保证保留添加到集合中的元素的顺序。
- 线程不安全: AbstractSet不是线程安全的,这意味着如果多个线程同时访问同一个集合,可能会导致数据不一致。如果需要线程安全,则可以使用同步集或并发集。
内部工作原理:
在内部,Java HashMap是作为链接列表数组实现的,其中数组中的每个元素都是一个桶,可以容纳一个或多个键值对。数组大小由HashMap的初始容量确定,可以在创建时指定。负载因子决定了何时应该调整HashMap的大小。
当往HashMap中添加键值对时,先使用键的hashCode()方法将键散列到数组中的索引。该索引对应数组中的一个桶。如果桶为空,则将键值对添加到桶中。如果桶不为空,则使用链表来存储已散列到相同索引的键值对。
当从HashMap中检索值时,先使用键的hashCode()方法将键散列到数组中的索引。然后遍历该索引处的链表,以查找具有指定键的键值对。如果在链表中未找到键,则与该键关联的值不在HashMap中。
当HashMap中的键值对数超过负载因子和HashMap当前容量的乘积时,HashMap将调整大小以增加容量。重新调整大小涉及创建一个具有更大大小的新数组,然后将旧数组中的所有键值对重新散列到新数组中。
Java HashMap还使用了一种称为开放寻址的技术,这意味着如果两个键具有相同的哈希码,则它们将存储在同一个桶中,但在单独的链表中。当检索具有与另一个键相同哈希码的键的值时,Java HashMap将首先使用它们的equals()方法比较键以确定返回哪个键值对。如果存在碰撞,则检索值可能需要更长的时间,因为需要遍历链表以查找键值对。
AbstractSet类的构造函数
1. protected AbstractSet(): __ 默认构造函数,但由于被保护,它不允许创建AbstractSet对象。
AbstractSet<E> as = new TreeSet<E>();
AbstractSet类的方法
| 方法 | 描述 |
|---|---|
| equals(Object o) | 将指定的对象与该集合进行比较以检查是否相等。 |
| hashCode() | 返回此集合的哈希码值。 |
| removeAll(Collection> c) | 从此集合中删除包含在指定集合中的所有元素(可选操作)。
**示例1:** **输出** **示例2:** **输出结果:**  ### 例子: 下面定义了一些类或接口的其他方法,这些方法有助于更好地理解AbstractSet类,如下所示: ### 声明在java.util.AbstractCollection类中的方法 方法 | 描述 |
如果此集合包含指定集合中的所有元素,则返回true。 |
| isEmpty() | 如果此集合不包含元素,则返回true。 |
| iterator() | 返回在此集合中包含的元素上的迭代器。 |
| remove(Object o) | 从此集合中删除指定元素的单个实例(如果存在)(可选操作)。 |
| retainAll(Collection> c) | 仅保留此集合中包含在指定集合中的元素(可选操作)。 toArray() | 返回包含此集合中所有元素的数组。 toArray(T[] a) | 返回包含此集合中所有元素的数组;返回的数组的运行时类型是指定数组的类型。 toString() | 返回此集合的字符串表示形式。 ### Interface java.util.Collection中声明的方法 方法 | 描述 ### Interface java.lang.Iterable中声明的方法 方法 | 描述 ### 接口java.util.Set中声明的方法 方法 | 描述 |
如果此集合包含指定集合中的所有元素,则返回 true。 |
| isEmpty() | 如果此集合不包含元素,则返回 true。 |
| iterator() | 返回此集合中的元素上的迭代器。 |
| remove(Object o) | 如果存在,则从此集合中移除指定元素(可选操作)。 |
| retainAll(Collection<?> c) | 仅保留此集合中包含于指定集合中的元素(可选操作)。 |
| size() | 返回此集合中的元素数(也称为集合的基数)。 |
| spliterator() | 为此集合中的元素创建 Spliterator。 |
| toArray() | 返回一个包含此集合中所有元素的数组。 |
| toArray(T[] a) | 返回一个包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的类型。 |
极客教程