type
status
date
slug
summary
tags
category
icon
password
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F0b374090-14d2-41b6-b4f3-645cf812b92b%2FUntitled.png?table=block&id=78440e28-2f0b-4d8b-ae6a-a362b6bbb5a8&t=78440e28-2f0b-4d8b-ae6a-a362b6bbb5a8)
在 Java 集合框架(Collections Framework)中,有几个重要的抽象类作为各种集合类的基础。这些抽象类提供了集合类的基本结构和通用方法。以下是 Java 集合框架中最重要的抽象类:
java.util.AbstractCollection
:这个抽象类是 Java 集合框架中所有集合类的基类。它实现了Collection
接口并提供了一些通用的方法,如isEmpty()
、size()
、toArray()
等。
java.util.AbstractList
:这个抽象类扩展了AbstractCollection
类并实现了List
接口。它提供了许多实现列表操作的基本方法,如get()
、set()
、indexOf()
等。在实现自定义列表类时,可以继承这个抽象类。
java.util.AbstractSet
:这个抽象类扩展了AbstractCollection
类并实现了Set
接口。它为实现无重复元素的集合类提供了基本结构。在实现自定义集合类时,可以继承这个抽象类。
java.util.AbstractMap
:这个抽象类实现了Map
接口。它提供了用于存储键值对的基本结构和一些通用的方法,如get()
、put()
、containsKey()
等。在实现自定义映射类时,可以继承这个抽象类。
java.util.AbstractQueue
:这个抽象类扩展了AbstractCollection
类并实现了Queue
接口。它提供了基本的队列操作,如offer()
、poll()
、peek()
等。在实现自定义队列类时,可以继承这个抽象类。
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
提供了一些默认实现,例如PriorityQueue
和ConcurrentLinkedQueue
等,可以直接使用或者继承覆盖以定制自己的队列操作
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
实现类,如HashMap
和TreeMap
等,或者继承AbstractMap
并实现其中的抽象方法和自定义方法,以满足自己的需求。