AbstractSet 类在Java中是一部分Java集合框架它实现了采集接口并扩展了AbstractCollection 类。它提供了 Set 接口的骨架实现。该类不会覆盖 AbstractCollection 类的任何实现,而只是添加 equals() 和 hashCode() 方法的实现。
通过扩展此类来实现 Set 的过程与通过扩展 AbstractCollection 来实现 Collection 的过程相同,只是此类子类中的所有方法和构造函数都必须遵守 Set 接口施加的附加约束(例如, add 方法不得允许将对象的多个实例添加到集合中)。
从类层次结构图可以看出,它实现了可迭代<E>,集合<E>,设置<E>接口。直接子类是ConcurrentSkipListSet,CopyOnWriteArraySet,EnumSet,HashSet,TreeSet。正如我们上面已经讨论过的,AbstractSet 是一个抽象类,因此应该为其分配一个子类的实例,例如 TreeSet、HashSet 或 EnumSet。
用法:宣言
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E>
其中 E 是该 Set 维护的元素类型。
抽象集的不同特征:
在Java中,AbstractSet类是一个实现Set接口的抽象类。 AbstractSet 的一些关键特征包括:
- 实现Set接口:AbstractSet实现了Set接口,这意味着它提供了一组标准的方法来操作集合。
- 实现一些设置方法:AbstractSet实现了Set接口的一些方法,例如size()、isEmpty()、contains()和remove()。
- 支持迭代器:AbstractSet 提供了一个迭代器方法,该方法返回集合中元素的迭代器。
- 不实现所有设置方法:AbstractSet是一个抽象类,并没有实现Set接口的所有方法。一些未实现的方法包括add()、addAll()和clear()。这些方法必须由 AbstractSet 的子类实现。
- 提供默认实现:AbstractSet 提供 Set 接口的某些方法的默认实现,如果需要,可以由子类覆盖。
- 支持空元素:AbstractSet 允许将 null 元素添加到集合中。
- Unordered:AbstractSet 是无序集合,这意味着不保留元素添加到集合中的顺序。
- Thread-unsafe:AbstractSet不是线程安全的,这意味着如果多个线程同时访问同一个集合,可能会导致数据不一致。如果需要线程安全,可以使用同步集或者并发集。
内部工作:
在内部,Java HashMap 被实现为一个链表数组,其中数组中的每个元素都是一个可以保存一个或多个键值对的存储桶。数组大小由 HashMap 的初始容量(可以在创建期间指定)和负载因子(确定何时应调整 HashMap 的大小)决定。
当将键值对添加到 HashMap 时,首先使用键的 hashCode() 方法将键哈希到数组中的索引。该索引对应于数组中的一个桶。如果桶为空,则将键值对添加到桶中。如果桶不为空,则使用链表存储哈希到同一索引的键值对。
当从 HashMap 检索值时,键首先被散列到数组中的索引。然后遍历该索引处的链表以查找具有指定键的键值对。如果在链表中找不到该键,则与该键关联的值不在 HashMap 中。
当HashMap中的键值对数量超过负载因子与HashMap当前容量的乘积时,调整HashMap的大小以增加容量。调整大小涉及创建一个更大大小的新数组,然后将旧数组中的所有键值对重新哈希到新数组中。
JavaHashMap还使用了一种称为开放寻址的技术,这意味着如果两个键具有相同的哈希码,则它们存储在同一个桶中,但存储在不同的链表中。当检索与另一个键具有相同哈希码的键的值时,Java HashMap 将首先使用 equals() 方法比较键,以确定要返回哪个键值对。如果存在冲突,则检索值可能需要更长的时间,因为需要遍历链表来查找键值对。
AbstractSet 类的构造函数
1. 受保护AbstractSet(): 默认构造函数,但受保护,它不允许创建 AbstractSet 对象。
AbstractSet<E> as = new TreeSet<E>();
Methods of AbstractSet
METHOD |
DESCRIPTION |
---|---|
AbstractSet.equals() | 比较指定对象与该集合是否相等。 |
AbstractSet.hashCode() | 返回该集合的哈希码值。 |
AbstractSet.removeAll() | 从此集合中删除指定集合中包含的所有元素(可选操作)。 |
示例 1:
Java
// Java Program to Illustrate AbstractSet Class
// Importing required classes
import java.util.*;
// Main class
public class GFG {
// Main driver method
public static void main(String[] args) throws Exception
{
// Try block to check for exceptions
try {
// Creating an empty TreeSet of integer type by
// creating object of AbstractSet
AbstractSet<Integer> abs_set
= new TreeSet<Integer>();
// Populating TreeSet
// using add() method
abs_set.add(1);
abs_set.add(2);
abs_set.add(3);
abs_set.add(4);
abs_set.add(5);
// Printing the elements inside above TreeSet
System.out.println("AbstractSet: " + abs_set);
}
// Catch block to handle the exceptions
catch (Exception e) {
// Display exception on console
System.out.println(e);
}
}
}
AbstractSet: [1, 2, 3, 4, 5]
示例 2:
Java
// Java Program to Illustrate Methods
// of AbstractSet class
// Importing required classes
import java.util.*;
// Main class
public class GFG {
// Main driver method
public static void main(String[] args) throws Exception
{
// Try block to check for exceptions
try {
// Creating an empty TreeSet of integer type
AbstractSet<Integer> abs_set
= new TreeSet<Integer>();
// Populating above TreeSet
// using add() method
abs_set.add(1);
abs_set.add(2);
abs_set.add(3);
abs_set.add(4);
abs_set.add(5);
// Printing the elements inside TreeSet
System.out.println("AbstractSet before "
+ "removeAll() operation : "
+ abs_set);
// Creating an ArrayList of integer type
Collection<Integer> arrlist2
= new ArrayList<Integer>();
// Adding elements to above ArrayList
arrlist2.add(1);
arrlist2.add(2);
arrlist2.add(3);
// Printing the ArrayList elements
System.out.println("Collection Elements"
+ " to be removed : "
+ arrlist2);
// Removing elements from AbstractSet specified
// using removeAll() method
abs_set.removeAll(arrlist2);
// Printing the elements of ArrayList
System.out.println("AbstractSet after "
+ "removeAll() operation : "
+ abs_set);
}
// Catch block to handle the exceptions
catch (NullPointerException e) {
// Display exception on console
System.out.println("Exception thrown : " + e);
}
}
}
输出:
例子:
Java
import java.util.*;
public class MySet<E> extends MyAbstractSet<E> {
public static void main(String[] args) {
MySet<String> set = new MySet<>();
set.add("apple");
set.add("banana");
set.add("orange");
set.add("pear");
set.add("banana"); // duplicate element
System.out.println("Set contains apple: " + set.contains("apple"));
System.out.println("Set contains watermelon: " + set.contains("watermelon"));
System.out.println("Set size: " + set.size());
Iterator<String> iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
}
}
下面定义了一些类或接口的其他方法,以某种方式帮助我们更好地理解AbstractSet类,如下所示:
类 java.util.AbstractCollection 中声明的方法
METHOD |
DESCRIPTION |
---|---|
AbstractCollection add() | 确保此集合包含指定的元素(可选操作)。 |
AbstractCollection addAll() | 将指定集合中的所有元素添加到此集合中(可选操作)。 |
AbstractCollection clear() | 从此集合中删除所有元素(可选操作)。 |
AbstractCollection contains() | 如果此集合包含指定元素,则返回 true。 |
AbstractCollection containsAll() | 如果此集合包含指定集合中的所有元素,则返回 true。 |
AbstractCollection isEmpty() | 如果此集合不包含任何元素,则返回 true。 |
AbsractCollection iterator() | 返回此集合中包含的元素的迭代器。 |
AbstractCollection remove() | 从此集合中删除指定元素的单个实例(如果存在)(可选操作)。 |
AbstractCollection retainAll() | 仅保留此集合中包含在指定集合中的元素(可选操作)。 |
AbstractCollection toArray() | 返回一个包含此集合中所有元素的数组。 |
AbstractCollection toArray() | 返回一个包含该集合中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。 |
AbstractCollection toString() | 返回此集合的字符串表示形式。 |
Methods Declared in Interface java.util.Collection
METHOD |
DESCRIPTION |
---|---|
parallelStream() | 返回一个可能并行的 Stream 并以此集合作为其源。 |
removeIf(Predicate<? super E> 过滤器) | 删除此集合中满足给定谓词的所有元素。 |
stream() | 返回以此集合作为源的顺序 Stream。 |
toArray(IntFunction<T[]> 生成器) | 返回一个包含此集合中所有元素的数组,使用提供的生成器函数分配返回的数组。 |
Methods Declared in interface java.lang.Iterable
METHOD |
DESCRIPTION |
---|---|
Iterable forEach() | 对 Iterable 的每个元素执行给定的操作,直到处理完所有元素或该操作引发异常。 |
Methods Declared in interface java.util.Set
METHOD |
DESCRIPTION |
---|---|
Set add() | 如果指定元素尚不存在,则将其添加到该集合中(可选操作)。 |
Set addAll() | 如果指定集合中的所有元素尚不存在,则将它们添加到该集合中(可选操作)。 |
Set clear() | 删除该集合中的所有元素(可选操作)。 |
Set contains() | 如果此集合包含指定元素,则返回 true。 |
Set containsAll() | 如果此集合包含指定集合的所有元素,则返回 true。 |
Set isEmpty() | 如果该集合不包含任何元素,则返回 true。 |
Set iterator() | 返回此集合中元素的迭代器。 |
Set remove() | 从此集合中删除指定元素(如果存在)(可选操作)。 |
Set retainAll() | 仅保留此集中包含在指定集合中的元素(可选操作)。 |
Set size() | 返回该集合中的元素数量(其基数)。 |
spliterator() | 在此集合中的元素上创建一个 Spliterator。 |
Set toArray() | 返回一个包含该集合中所有元素的数组。 |
Set toArray() | 返回一个包含该集合中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。 |
相关用法
- Java AbstractSet toArray(T[])用法及代码示例
- Java AbstractSet add()用法及代码示例
- Java AbstractSet clear()用法及代码示例
- Java AbstractSet contains()用法及代码示例
- Java AbstractSet containsAll()用法及代码示例
- Java AbstractSet equals()用法及代码示例
- Java AbstractSet hashCode()用法及代码示例
- Java AbstractSet isEmpty()用法及代码示例
- Java AbstractSet removeAll()用法及代码示例
- Java AbstractSet retainAll()用法及代码示例
- Java AbstractSet size()用法及代码示例
- Java AbstractSet toArray()用法及代码示例
- Java AbstractSet toString()用法及代码示例
- Java AbstractSequentialList addAll()用法及代码示例
- Java AbstractSequentialList clear()用法及代码示例
- Java AbstractSequentialList conatinsAll()用法及代码示例
- Java AbstractSequentialList contains()用法及代码示例
- Java AbstractSequentialList equals()用法及代码示例
- Java AbstractSequentialList get()用法及代码示例
- Java AbstractSequentialList hashCode()用法及代码示例
- Java AbstractSequentialList indexOf()用法及代码示例
- Java AbstractSequentialList isEmpty()用法及代码示例
- Java AbstractSequentialList lastIndexOf()用法及代码示例
- Java AbstractSequentialList remove()用法及代码示例
- Java AbstractSequentialList removeAll()用法及代码示例
注:本文由纯净天空筛选整理自RishabhPrabhu大神的英文原创作品 AbstractSet Class in Java with Examples。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。