Java中的AbstractSet类及其示例

Java中的AbstractSet类及其示例

Java中的AbstractSet类 是Java集合框架的一部分,实现了 Collection接口 并扩展了 AbstractCollection类 。它为Set接口提供了骨架实现。这个类没有覆盖AbstractCollection类中的任何实现,而是仅为equals()和hashCode()方法添加了实现。

通过扩展此类来实现集合的过程与通过扩展AbstractCollection来实现集合的过程相同,只是此类的子类中的所有方法和构造函数都必须遵守Set接口所施加的附加约束(例如,add方法不能允许将对象的多个实例添加到一个集合中)。

Java中的AbstractSet类及其示例

从类层次结构图中可以得出该类实现了 **Iterable ** 、 **Collection ** 和Set接口。它的直接子类是ConcurrentSkipListSet、CopyOnWriteArraySet、EnumSet、HashSet、TreeSet等。正如我们在上面讨论过的,AbstractSet是一个抽象类,因此应该将木板分配给其子类,例如TreeSet、HashSet或EnumSet。

语法: 声明

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:**
“`java
// 展示AbstractSet类的Java程序
 
// 导入所需类
import java.util.*;
 
// 主程序
public class GFG {
 
    // 主驱动程序
    public static void main(String[] args) throws Exception
    {
        // 尝试检查异常
        try {
 
            // 通过创建AbstractSet对象创建整数类型的空TreeSet
            AbstractSet<Integer> abs_set
                = new TreeSet<Integer>();
 
            // 使用add()方法填充TreeSet
            abs_set.add(1);
            abs_set.add(2);
            abs_set.add(3);
            abs_set.add(4);
            abs_set.add(5);
 
            // 打印上述TreeSet中的元素
            System.out.println("AbstractSet: " + abs_set);
        }
 
        // 捕获异常
        catch (Exception e) {
 
            // 在控制台上显示异常
            System.out.println(e);
        }
    }
}
“`

**输出**
“`java
AbstractSet: [1, 2, 3, 4, 5]
“`

**示例2:**
“`java
// Java程序展示AbstractSet类的方法
 
// 导入所需的类
import java.util.*;
 
// 主类
public class GFG {
 
    // 主驱动程序
    public static void main(String[] args) throws Exception
    {
 
        // 尝试块捕获异常
        try {
 
            // 创建一个整型的空TreeSet
            AbstractSet<Integer> abs_set
                = new TreeSet<Integer>();
 
            // 使用add()方法填充上述TreeSet
            abs_set.add(1);
            abs_set.add(2);
            abs_set.add(3);
            abs_set.add(4);
            abs_set.add(5);
 
            // 输出TreeSet中的元素
            System.out.println("AbstractSet在removeAll()操作前: "
                               + abs_set);
 
            // 创建一个整型ArrayList
            Collection<Integer> arrlist2
                = new ArrayList<Integer>();
 
            // 将元素添加到上述ArrayList中
            arrlist2.add(1);
            arrlist2.add(2);
            arrlist2.add(3);
 
            // 输出ArrayList的元素
            System.out.println("要删除的Collection元素: "
                               + arrlist2);
 
            // 使用removeAll()方法删除指定的AbstractSet中的元素
            abs_set.removeAll(arrlist2);
 
            // 输出ArrayList的元素
            System.out.println("AbstractSet在removeAll()操作后: "
                               + abs_set);
        }
 
        // 捕获和处理异常的catch块
        catch (NullPointerException e) {
 
            // 在控制台上显示异常
            System.out.println("发生异常: " + e);
        }
    }
}
“`

**输出结果:**

![Java中的AbstractSet类及其示例](https://static.deepinout.com/geekdocs/2023/05/04/20230516163751-2.png “Java中的AbstractSet类及其示例”)

### 例子:
“`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"); // 重复的元素
 
        System.out.println("Set中是否包含apple: " + set.contains("apple"));
        System.out.println("Set中是否包含watermelon: " + set.contains("watermelon"));
        System.out.println("Set大小: " + set.size());
 
        Iterator<String> iter = set.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());
        }
    }
}
“`

下面定义了一些类或接口的其他方法,这些方法有助于更好地理解AbstractSet类,如下所示:

### 声明在java.util.AbstractCollection类中的方法

方法 | 描述
—|—
add​(E e) | 确保此集合包含指定的元素(可选操作)。
addAll​(Collection c) | 将指定集合中的所有元素添加到此集合中(可选操作)。
clear() | 从此集合中删除所有元素(可选操作)。
contains​(Object o) | 如果此集合包含指定的元素则返回true。
containsAll​(Collection c)

如果此集合包含指定集合中的所有元素,则返回true。
isEmpty() 如果此集合不包含元素,则返回true。
iterator() 返回在此集合中包含的元素上的迭代器。
remove​(Object o) 从此集合中删除指定元素的单个实例(如果存在)(可选操作)。
retainAll​(Collection c) | 仅保留此集合中包含在指定集合中的元素(可选操作)。
toArray() | 返回包含此集合中所有元素的数组。
toArray​(T[] a) | 返回包含此集合中所有元素的数组;返回的数组的运行时类型是指定数组的类型。
toString() | 返回此集合的字符串表示形式。

### Interface java.util.Collection中声明的方法

方法 | 描述
—|—
parallelStream() | 返回以此集合作为其源的可能并行的Stream。
removeIf​(Predicate filter) | 删除满足给定谓词的此集合的所有元素。
stream() | 返回以此集合作为其源的顺序Stream。
toArray​(IntFunction generator) | 使用所提供的生成器函数分配返回的数组,返回包含此集合中所有元素的数组。

### Interface java.lang.Iterable中声明的方法

方法 | 描述
—|—
forEach​(Consumer action) | 对Iterable的每个元素执行给定操作,直到所有元素都被处理或操作抛出异常。

### 接口java.util.Set中声明的方法

方法 | 描述
—|—
add​(E e) | 如果尚未存在则将指定的元素添加到此集合中(可选操作)。
addAll​(Collection c) | 如果它们尚未存在,则将指定集合中的所有元素添加到此集合中(可选操作)。
clear() | 从此集合中移除所有元素(可选操作)。
contains​(Object o) | 如果此集合包含指定的元素,则返回 true。
containsAll​(Collection c)

如果此集合包含指定集合中的所有元素,则返回 true。
isEmpty() 如果此集合不包含元素,则返回 true。
iterator() 返回此集合中的元素上的迭代器。
remove​(Object o) 如果存在,则从此集合中移除指定元素(可选操作)。
retainAll​(Collection<?> c) 仅保留此集合中包含于指定集合中的元素(可选操作)。
size() 返回此集合中的元素数(也称为集合的基数)。
spliterator() 为此集合中的元素创建 Spliterator。
toArray() 返回一个包含此集合中所有元素的数组。
toArray​(T[] a) 返回一个包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的类型。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程