NotionNext
NotionNext
编程爱好者
/互联网从业者
/知识分享博主
认知决定态度,态度决定选择,选择决定人生

Java集合框架之抽象类

NotionNext - 2023-4-14 - Technical / Java / 后端
发布于:2023-4-14|最后更新: 2023-8-29|
type
status
date
slug
summary
tags
category
icon
password
notion image
在 Java 集合框架(Collections Framework)中,有几个重要的抽象类作为各种集合类的基础。这些抽象类提供了集合类的基本结构和通用方法。以下是 Java 集合框架中最重要的抽象类:
  1. java.util.AbstractCollection:这个抽象类是 Java 集合框架中所有集合类的基类。它实现了 Collection 接口并提供了一些通用的方法,如 isEmpty()size()toArray() 等。
  1. java.util.AbstractList:这个抽象类扩展了 AbstractCollection 类并实现了 List 接口。它提供了许多实现列表操作的基本方法,如 get()set()indexOf() 等。在实现自定义列表类时,可以继承这个抽象类。
  1. java.util.AbstractSet:这个抽象类扩展了 AbstractCollection 类并实现了 Set 接口。它为实现无重复元素的集合类提供了基本结构。在实现自定义集合类时,可以继承这个抽象类。
  1. java.util.AbstractMap:这个抽象类实现了 Map 接口。它提供了用于存储键值对的基本结构和一些通用的方法,如 get()put()containsKey() 等。在实现自定义映射类时,可以继承这个抽象类。
  1. java.util.AbstractQueue:这个抽象类扩展了 AbstractCollection 类并实现了 Queue 接口。它提供了基本的队列操作,如 offer()poll()peek() 等。在实现自定义队列类时,可以继承这个抽象类。
  1. java.util.AbstractSequentialList:这个抽象类扩展了 AbstractList 类,专为那些以顺序访问为主的列表实现提供更高效的操作。在实现链表等顺序存储结构的列表类时,可以继承这个抽象类。

AbstractCollection

  • AbstractCollection是一个抽象类,它实现了Collection接口。AbstractCollection类提供了一些基本的实现方法,这些方法可以被普通集合类重写。AbstractCollection类还包括一些抽象方法,这些方法必须被普通集合类实现。AbstractCollection类中的大部分方法都是使用了迭代器实现的
  • AbstractCollection类中的一些重要方法包括:
    • add(Object o): 向集合中添加一个元素;
    • addAll(Collection c): 将指定集合中的所有元素添加到该集合中;
    • contains(Object o): 判断集合是否包含指定元素;
    • containsAll(Collection c): 判断集合是否包含指定集合中的所有元素;
    • size(): 返回集合中元素的个数;
    • isEmpty(): 判断集合是否为空;
    • remove(Object o): 从集合中删除指定元素;
    • removeAll(Collection c): 从集合中删除指定集合中的所有元素;
    • retainAll(Collection c): 仅保留集合中包含在指定集合中的元素;
    • clear(): 删除集合中的所有元素;
    • toArray(): 将集合转换成数组。
  • 使用AbstractCollection可以更容易地创建自定义集合类。我们可以继承AbstractCollection类并实现必要的方法,然后将我们的自定义集合类实例化并使用它们。通过继承AbstractCollection,我们可以重复使用该类中的现有方法,从而使代码更加简洁。

AbstractList

  • AbstractList是一个抽象类,实现了List接口,提供了一些基本的实现方法。如果我们要定义自己的列表类,继承AbstractList可以使得定义变得更加简单。AbstractList类提供了大量的方法,包括获取元素、添加元素、删除元素、遍历元素等。
  • AbstractList类中的一些重要方法包括:
    • get(int index): 获取指定索引处的元素;
    • set(int index, E element): 用指定元素替换指定索引处的元素;
    • add(E element): 在列表末尾添加指定元素;
    • add(int index, E element): 在指定索引处添加指定元素;
    • remove(int index): 删除指定索引处的元素;
    • indexOf(Object o): 返回指定元素在列表中第一次出现的索引;
    • lastIndexOf(Object o): 返回指定元素在列表中最后一次出现的索引;
    • iterator(): 返回列表的迭代器,用于遍历列表中的元素;
    • listIterator(): 返回列表的列表迭代器,用于遍历列表中的元素和修改列表;
    • subList(int fromIndex, int toIndex): 返回列表中从指定起始索引到结束索引但不包括结束索引的子列表。
    • clear(): 删除集合中的所有元素
  • AbstractList类中的方法都是跟具体的数据结构无关的通用方法,它们并没有提供直接的数据结构支持。具体的数据结构实现需要我们在自己的类中实现的一些详细逻辑。
  • 通过继承AbstractList,我们可以更方便地定义自己的列表类。只需要实现AbstractList类中要求实现的抽象方法,就可以获得一个完整的具有常用列表操作方法的类

AbstractSequentialList

  • AbstractSequentialList是一个抽象类,实现了List接口和Deque接口,提供了一些基本的实现方法。如果我们要定义自己的列表类或者双端队列类,继承AbstractSequentialList可以使得定义变得更加简单。
  • AbstractSequentialList类中的一些重要方法包括:
    • add(E e): 在列表末尾添加指定元素;
    • abstract void add(int index, E element): 在指定索引处添加指定元素;
    • abstract ListIterator listIterator(int index): 返回列表中从指定位置开始的列表迭代器;
    • get(int index): 获取指定索引处的元素;
    • remove(int index): 删除指定索引处的元素;
    • abstract E set(int index, E element): 用指定元素替换指定索引处的元素;
    • abstract int size(): 返回列表的大小。
  • 需要注意的是,AbstractSequentialList是一个顺序访问列表,数据结构必须支持按顺序访问操作。因此,在我们编写自己定义的类时,我们需要确保数据结构支持按顺序访问操作,否则实现会出现问题。
  • 通过继承AbstractSequentialList,我们可以更方便地定义自己的列表类或者双端队列类。只需要实现AbstractSequentialList类中要求实现的抽象方法,就可以获得一个完整的具有常用列表操作方法或者双端队列操作方法的类。

AbstractSet

  • Java中的AbstractSet类是一个抽象类,它实现了Set接口的骨架方法,以最小化实现该接口所需的工作量。它包含了所有实现Set所需的基本骨架方法,但是没有实现任何与集合相关的操作,比如add, remove等方法。
  • AbstractSet类中除了实现了iterator()size()方法,其他的add()remove()addAll()contains()containsAll()equals()hashCode()isEmpty()toArray()等都是未实现的。因此,所有继承AbstractSet类的子类都必须实现这些方法。
  • 通过实现AbstractSet类的子类,开发者可以方便地创建自定义的集合类,这些类可以定制实现特殊需求的集合操作。当然在子类扩展AbstractSet类时,也可以覆盖一些在性能方面可能有提高的方法。
  • 需要注意的是,AbstractSet类本身并不能创建实例,而是提供一个常用的接口,使得子类在实现自定义的集合类时遵循了一定的规范和共享了一些接口方法。因此,开发者在编写具体的集合类时,只需要继承AbstractSet类并实现必要的方法,即可使得集合类符合Java集合框架的实现规范。

AbstractQueue

  • AbstractQueue是一个抽象类,实现了Queue接口。它提供了一个骨架实现,便于开发人员实现Queue接口,同时支持优先级队列等具体队列的实现。
  • AbstractQueue类中的一些重要方法包括:
    • add(E element) 和 offer(E element):这两个方法都用于向队列尾部添加元素。它们的区别在于,add()方法在队列已满时会抛出IllegalStateException异常,而offer()方法则会返回false。
    • remove() 和 poll():这两个方法都用于移除并返回队列头部的元素,区别在于,当队列为空时,remove()方法会抛出NoSuchElementException异常,而poll()方法则返回null。
    • element() 和 peek():这两个方法都用于检索队列头部的元素,区别在于,当队列为空时,element()方法会抛出NoSuchElementException异常,而peek()方法则返回null。
    • size():这个方法用于返回队列中元素的数量。
    • clear():这个方法用于移除队列中的所有元素。
    • iterator():这个方法返回队列中元素的迭代器。
  • AbstractQueue是一个抽象类,必须通过继承实现具体的队列类。AbstractQueue 提供了一些默认实现,例如PriorityQueueConcurrentLinkedQueue等,可以直接使用或者继承覆盖以定制自己的队列操作

AbstractMap

  • AbstractMap是Java中实现Map接口的抽象类,提供了Map接口操作的骨架实现,包括默认实现、抽象方法和通用方法
  • AbstractMap类中的方法分为三类
    • Map操作方法:这些方法包括put()get()remove()containsKey()containsValue() 等,用于管理Map中的键值对。这些方法的实现由具体的子类实现。
    • 视图方法:这些方法包括keySet()entrySet()values()等,返回Map中的不同子集集合,实际上是由具体的子类来实现的。
    • 计数和辅助方法:这些方法包括size()isEmpty()equals()hashCode()等,提供了一些辅助方法和属性,用于方便地获取和操作Map的基本信息。
  • entrySet()Map接口定义的一个方法,用于返回一个Set视图,其中包含Map中的键值对(entry)。每个元素(即entry对象)都实现了Map.Entry接口,包含键值对中的键和值两个元素。entrySet()返回的是Map中键值对(entry)的集合视图,该视图是对原Map的引用,对视图进行的修改会反映到原Map上。并且可以使用集合类库提供的基本操作,例如过滤、映射、排序等。
  • AbstractMap是一个抽象类,不能直接创建实例。开发人员可以使用Java提供的具体Map实现类,如HashMapTreeMap等,或者继承AbstractMap并实现其中的抽象方法和自定义方法,以满足自己的需求。
Java集合之ArrayListJava集合一些重要的接口