Java ArrayList
ArrayList是Java 集合框架 的一部分,它是java.util包的一个类。它为我们提供了Java中的动态数组。尽管它可能比标准数组慢,但在需要对数组进行大量操作的程序中是很有帮助的。这个类在 java.util 包中可以找到。ArrayList的主要优点是,如果我们声明一个数组,就需要提到它的大小,但在ArrayList中,不需要提到ArrayList的大小,如果你想提到大小,你可以做到。
插图
例子1: 下面的实现演示了如何创建和使用ArrayList并提及它的大小。
输出
例2: 下面的实现演示了如何创建和使用一个没有提到大小的ArrayList。
输出
输出
输出与例1相同。由于ArrayList是一个动态数组,我们在创建它时不必指定大小,当我们动态地添加和删除项目时,数组的大小会自动增加。虽然实际的库实现可能更复杂,但以下是一个非常基本的想法,解释了当数组变满和我们试图添加一个项目时数组的工作。
- 在堆内存上创建一个更大的内存(例如,双倍大小的内存)。
- 将当前内存中的元素复制到新的内存中。
- 由于现在有更大的内存可用,所以新的项目现在被添加。
- 删除旧的内存。
ArrayList的重要特征
- ArrayList继承了AbstractList类并实现了List接口。
- ArrayList通过大小进行初始化。然而,如果集合增长,大小会自动增加,如果对象从集合中删除,则会自动缩小。
- Java ArrayList允许我们随机地访问列表。
- ArrayList不能用于原始类型,如int、char等。我们需要一个封装类来处理这种情况。
- Java中的ArrayList可以被看作是C++中的一个向量。
- ArrayList是不同步的。它在Java中的对应同步类是Vector。
让我们深入了解一下Java的ArrayList请看下面的图片。
在上图中,AbstractList、CopyOnWriteArrayList和AbstractSequentialList是实现列表接口的类。在上述的每一个类中都实现了单独的功能。它们是
- AbstractList: 该类用于实现一个不可修改的列表,为此只需要扩展这个AbstractList类,并只实现get()和size()方法。
- CopyOnWriteArrayList: 该类实现了列表接口。它是ArrayList的增强版,其中所有的修改(添加、设置、删除等)都是通过对列表进行新的复制来实现的。
- AbstractSequentialList: 该类实现了Collection接口和AbstractCollection类。这个类用于实现一个不可修改的列表,为此只需要扩展这个AbstractList类,并只实现get()和 size()方法。
ArrayList的构造函数
为了创建一个ArrayList,我们需要创建一个ArrayList类的对象。ArrayList类由各种构造函数组成,允许创建数组列表的可能性。以下是该类中可用的构造函数:
1.ArrayList(): 这个构造函数用于建立一个空的数组列表。如果我们希望创建一个名称为 arr 的空数组列表,那么,它可以被创建为。
ArrayList arr = new ArrayList();
2.ArrayList(Collection c): 这个构造函数用来建立一个数组列表,初始化为集合c中的元素。假设我们希望创建一个ArrayList arr,包含集合c中的元素,那么,它可以被创建为:
ArrayList arr = new ArrayList(c);
3.ArrayList(int capacity): 这个构造函数用来建立一个有指定初始容量的数组列表。假设我们希望创建一个初始容量为N的ArrayList,那么,可以这样创建。
ArrayList arr = new ArrayList(N)
Java ArrayList中的方法
方法 | 描述 |
---|---|
add(int index, Object element) | 这个方法用来在列表中的特定位置插入一个特定的元素。 |
add(Object o) | 这个方法用来将一个特定的元素追加到列表的最后。 |
addAll(Collection C) | 该方法用于将一个特定集合中的所有元素追加到所述列表的末尾,其顺序是由指定集合的迭代器返回的值。 |
addAll(int index, Collection C) | 该方法用于将一个特定集合中从指定位置开始的所有元素插入到所述列表中。 |
clear() | 这个方法用来删除任何列表中的所有元素。 |
clone() | 该方法用于返回一个ArrayList的浅层拷贝。 |
contains?(Object o) | 如果这个列表包含指定的元素,则返回true。 |
ensureCapacity?(int minCapacity) | 如果需要的话,增加这个ArrayList实例的容量,以确保它至少可以容纳最小容量参数所指定的元素数量。 |
forEach?(Consumer action) | 对Iterable中的每个元素执行给定的动作,直到所有元素都被处理完,或者该动作引发异常。 get?(int index) | 返回这个列表中指定位置的元素。 indexOf(Object O) | 返回特定元素第一次出现的索引,如果该元素不在列表中,则返回-1。 isEmpty?() | 如果这个列表不包含任何元素,返回true。 lastIndexOf(Object O) | 如果该元素不在列表中,则返回特定元素最后出现的索引或-1。 listIterator?() | 返回此列表中元素的列表迭代器(按适当的顺序)。 listIterator?(int index) | 返回一个列表中元素的迭代器(按适当的顺序),从列表中的指定位置开始。 remove?(int index) | 移除这个列表中指定位置的元素。 remove?(Object o) | 从这个列表中移除第一次出现的指定元素,如果它存在的话。 removeAll?(Collection c) | 从这个列表中移除所有包含在指定集合中的元素。 removeIf?(Predicate filter) | 删除这个集合中满足给定谓词的所有元素。 removeRange?(int fromIndex, int toIndex) | 从这个列表中移除所有索引在fromIndex(包括)和toIndex(不包括)之间的元素。 retainAll?(Collection c) |
只保留这个列表中包含在指定集合中的元素。 |
set?(int index, E element) | 用指定的元素替换这个列表中指定位置上的元素。 |
size?() | 返回此列表中的元素数量。 |
spliterator?() | 在这个列表中的元素上创建一个晚期绑定的、故障快速的Spliterator。 |
subList?(int fromIndex, int toIndex) | 返回列表中从指定的fromIndex(含)到toIndex(不含)之间的部分视图。 |
toArray() | 这个方法用来返回一个包含列表中所有元素的数组,顺序正确。 |
toArray(Object[] O) | 这个方法也是用来返回一个数组,其中包含这个列表中的所有元素,其顺序与前面的方法相同。 |
trimToSize() | 该方法用于将ArrayList实例的容量修剪到列表的当前大小。 |
Note: You can also create a generic ArrayList:
ArrayList的一些关键点
- ArrayList是下划线的数据结构,可调整阵列或可增长阵列。
- 允许ArrayList的重复。
- 保留了插入顺序。
- 允许异质对象。
- 可以进行空插入。
让我们看看如何在ArrayList上执行一些基本操作,我们将在实现每个操作的同时进一步讨论。
- 向列表添加元素/添加元素
- 改变元素/设置元素
- 移除元素/删除元素
- 遍历元素
- 获取元素
- 在两个数字之间添加元素
- 排序元素
- 阵列列表的大小
操作1: 添加元素
为了向ArrayList添加一个元素,我们可以使用add()方法。这个方法是重载的,可以根据不同的参数执行多种操作。它们是如下的。
- add(Object)。该方法用于在ArrayList的最后添加一个元素。
- add(int index, Object):该方法用于在ArrayList的特定索引处添加一个元素。
例子
输出
操作2: 改变元素
添加完元素后,如果我们想改变元素,可以用set()方法来完成。由于ArrayList是有索引的,我们希望改变的元素是通过元素的索引来引用的。因此,该方法需要一个索引和需要在该索引处插入的更新元素。
例子
输出
操作3: 删除元素
为了从ArrayList中移除一个元素,我们可以使用remove()方法。这个方法是重载的,可以根据不同的参数执行多种操作。它们是如下的。
- remove(Object): 该方法用于简单地从ArrayList中删除一个对象。如果有多个这样的对象,那么第一个出现的对象将被删除。
- remove(int index): 由于ArrayList是有索引的,这个方法需要一个整数值,它可以简单地移除ArrayList中存在于该特定索引的元素。在移除元素后,所有的元素都被移到左边以填补空间,对象的索引被更新。
例子
输出
操作4: 迭代ArrayList
有多种方法可以在ArrayList中进行迭代。最著名的方法是使用基本的for循环,结合get()方法来获取特定索引的元素,以及使用高级for循环。
例子
输出
操作:5-获取元素
输出
操作 6- 在两个数字之间添加元素
输出
操作7-排序元素
输出
操作8-元素的大小
输出