Java中的AbstractList及其实例
Java中的AbstractList类是Java集合框架的一部分,实现了Collection接口和AbstractCollection类。该类提供了List接口的骨架实现,以最小化实现这个接口所需的工作量,并由一个随机访问数据存储(例如数组)支持。对于顺序访问数据(例如链接列表),应优先使用AbstractSequentialList类而不是此类。
要实现一个不能修改的列表,只需要扩展这个AbstractList类并实现get(int)和size()方法即可。要实现一个可修改的列表,还需要重写set(int index, E element)方法(否则会抛出UnsupportedOperationException异常)。如果列表是可变大小的,则应重写add(int, E)和remove(int)方法。
类层次结构:
声明:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
其中 E 是该集合维护的元素类型。
构造方法: protected AbstractList() – 除了默认构造方法以外, 保护访问级别的直接调用不能创建 AbstractList 对象。
AbstractList
实例 1: AbstractList是一个抽象类,因此应该分配其子类(例如ArrayList、LinkedList或Vector)的实例。
// Java代码演示AbstractList
import java.util.*;
public class AbstractListDemo {
public static void main(String args[])
{
// 创建一个空的AbstractList
AbstractList<String> list = new ArrayList<String>();
// 使用add()方法向列表添加元素
list.add("Geeks");
list.add("for");
list.add("Geeks");
list.add("10");
list.add("20");
// 显示AbstractList
System.out.println("AbstractList:" + list);
}
}
输出
AbstractList:[Geeks, for, Geeks, 10, 20]
示例 2:
// Java代码演示AbstractList的方法
import java.util.*;
public class AbstractListDemo {
public static void main(String args[])
{
// 创建一个空的AbstractList
AbstractList<String>
list = new LinkedList<String>();
// 使用add()方法向列表添加元素
list.add("Geeks");
list.add("for");
list.add("Geeks");
list.add("10");
list.add("20");
// 输出列表
System.out.println("AbstractList: " + list);
// 使用remove()方法删除头部
list.remove(3);
// 打印最终列表
System.out.println("Final AbstractList: " + list);
// 使用lastIndexOf()方法获取最后一个出现的索引
int lastindex = list.lastIndexOf("A");
// 打印索引
System.out.println("Last index of A : "
+ lastindex);
}
}
输出
AbstractList: [Geeks, for, Geeks, 10, 20]
Final AbstractList: [Geeks, for, Geeks, 20]
Last index of A : -1
AbstractList中的方法
方法 | 描述 |
---|---|
add(int index, E element) | 将指定元素插入到列表的指定位置(可选操作)。 |
add(E e) | 将指定元素追加到列表的末尾(可选操作)。 |
addAll(int index, Collection extends E> c) | 将指定集合中的所有元素插入到列表的指定位置(可选操作)。 clear() | 从列表中删除所有元素(可选操作)。 equals(Object o) | 将指定对象与此列表进行比较以判断是否相等。 get(int index) | 返回列表中指定位置的元素。 hashCode() | 返回此列表的哈希码值。 indexOf(Object o) | 返回此列表中指定元素的第一次出现的索引位置,如果列表不包含该元素,则返回 -1。 iterator() | 返回按适当顺序在此列表中的元素上进行迭代的迭代器。 lastIndexOf(Object o) | 返回此列表中指定元素的最后一次出现的索引位置,如果列表不包含该元素,则返回 -1。 listIterator() | 返回按适当顺序在此列表中的元素上进行迭代的列表迭代器。 listIterator(int index) | 返回从列表中指定位置开始,按适当顺序在此列表中的元素上进行迭代的列表迭代器。 remove(int index) | 删除列表中指定位置的元素(可选操作)。 removeRange(int fromIndex, int toIndex) | 从列表中删除索引位于 fromIndex(含)和 toIndex(不含)之间的所有元素。 set(int index, E element) | 使用指定的元素替换列表中指定位置的元素(可选操作)。 subList(int fromIndex, int toIndex) | 返回此列表在指定的 fromIndex(含)和 toIndex(不含)之间的部分的视图。 ### 在 java.util.AbstractCollection 类中声明的方法 方法 | 描述 |
如果此集合包含指定集合中的所有元素,则返回true。 |
isEmpty() | 如果此集合不包含任何元素,则返回true。 |
remove(Object o) | 从此集合中删除指定元素的单个实例(如果存在)(可选操作)。 |
removeAll(Collection> c) | 删除此集合中也包含在指定集合中的所有元素(可选操作)。 retainAll(Collection> c) |
仅保留此集合中包含在指定集合中的元素(可选操作)。 |
toArray() | 返回包含此集合中所有元素的数组。 |
toArray(T[] a) | 返回一个包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的类型。 |
toString() | 返回此集合的字符串表示形式。 |
接口java.util.Collection中声明的方法
方法 | 描述 |
---|---|
parallelStream() | 返回一个可能是并行的Stream,并以此集合为其源。 |
removeIf(Predicate super E> filter) | 删除满足给定谓词的所有集合元素。 stream() | 返回一个以此集合为源的顺序Stream。 toArray(IntFunction ### 接口java.util.List中声明的方法 方法 | 描述 |
如果此列表包含指定集合中的所有元素,则返回 true。 |
isEmpty() | 如果此列表不包含任何元素,则返回 true。 |
remove(int index) | 删除列表中指定位置的元素(可选操作)。 |
removeAll(Collection> c) | 从此列表中删除包含在指定集合中的所有元素(可选操作)。 replaceAll(UnaryOperator retainAll(Collection> c) |
仅保留此列表中包含在指定集合中的元素(可选操作)。 |
size() | 返回此列表中的元素数。 |
sort(Comparator<? super E> c) | 根据指定的比较器引起的顺序对此列表进行排序。 |
spliterator() | 在此列表中的元素上创建一个 Spliterator。 |
toArray() | 以恰当的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组。 |
toArray(T[] a) | 将此列表中所有元素以恰当的顺序(从第一个元素到最后一个元素)放入指定数组中;返回的数组运行时类型为指定数组的类型。 |
Java 中的 AbstractList 类是 List 接口的骨架实现的抽象类。它是 Java 集合框架的一部分,并且旨在被像 ArrayList 和 LinkedList 等具体列表实现的子类继承。
以下是如何在 Java 中使用 AbstractList 类的示例:
import java.util.AbstractList;
import java.util.List;
public class MyList extends AbstractList<Integer> {
private int size;
public MyList(int size) {
this.size = size;
}
@Override
public Integer get(int index) {
return index;
}
@Override
public int size() {
return size;
}
public static void main(String[] args) {
List<Integer> list = new MyList(5);
for (int i : list) {
System.out.println(i);
}
}
}
输出:
0
1
2
3
4
通过扩展 AbstractList 类,您只需要实现 get 和 size 方法,就可以提供一个列表的基本实现。这可以比从头开始实现 List 接口节省大量的时间和代码。
使用 AbstractList 的优点:
- 通过使用AbstractList类作为基础,您可以减少编写实现列表所需的代码量,因为已经为您实现了许多常见方法。
- 由于AbstractList类实现了List接口中的许多方法,因此您可以确保您的实现与其他列表实现(如ArrayList和LinkedList)具有一致的行为。
在Java中使用AbstractList的缺点:
- 有限的功能:由于AbstractList类是一个抽象类,它仅提供列表的基本实现。您可能需要实现其他方法来提供应用程序所需的全部功能。
- 增加复杂性:通过扩展AbstractList类,您正在增加代码的复杂性,因为依靠基类提供某些行为。