Java中的ArrayList
Java ArrayList 是Java 集合框架 的一部分,它是java.util包中的一个类。它为我们提供了Java中的动态数组。虽然它可能比标准数组慢,但在需要对数组进行大量操作的程序中会很有帮助。此类在 java.util 包中找到。 Java ArrayList的主要优点是,如果我们声明了一个数组,则需要指定其大小,但是在ArrayList中,如果不想指定ArrayList的大小,则不需要指定其大小。如果您想指定大小,则可以这样做。
Java中的ArrayList是什么?
ArrayList是一个使用List接口实现的Java类。正如名称所示,Java ArrayList提供了动态数组的功能,其中数组的大小未固定。同时作为集合框架的一部分,它具有许多数组不可用的特性。

说明:

Java ArrayList示例
示例1: 以下示例演示如何创建并使用带有大小的ArrayList。
// Java program to demonstrate the
// working of ArrayList
import java.io.*;
import java.util.*;
class ArrayListExample {
public static void main(String[] args)
{
// Size of the
// ArrayList
int n = 5;
// Declaring the ArrayList with
// initial size n
ArrayList<Integer> arr1 = new ArrayList<Integer>(n);
// Declaring the ArrayList
ArrayList<Integer> arr2 = new ArrayList<Integer>();
// Printing the ArrayList
System.out.println("Array 1:" + arr1);
System.out.println("Array 2:" + arr2);
// Appending new elements at
// the end of the list
for (int i = 1; i <= n; i++) {
arr1.add(i);
arr2.add(i);
}
// Printing the ArrayList
System.out.println("Array 1:" + arr1);
System.out.println("Array 2:" + arr2);
}
}
输出
Array 1:[]
Array 2:[]
Array 1:[1, 2, 3, 4, 5]
Array 2:[1, 2, 3, 4, 5]
解释:
ArrayList 是一种动态数组,创建时不需要指定大小,数组的大小会在动态添加和删除项时自动增加。尽管实际库实现可能更复杂,以下是一个基本的思路,解释了当数组变满且我们尝试添加项时,数组的工作方式:
- 在堆内存上创建更大的内存(例如双倍大小的内存)。
- 将当前的内存元素复制到新内存中。
- 现在添加新项目,因为现在有更大的内存可用。
- 删除旧内存。
Java 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类并实现 getter() 和 size() 方法即可。
ArrayList中的构造函数
为了创建一个ArrayList,我们需要创建ArrayList类的一个对象。ArrayList类包括各种构造函数,允许可能的数组列表创建。以下是此类中可用的构造函数:
1. ArrayList()
此构造函数用于构建一个空数组列表。如果我们想要创建一个名为arr的空的ArrayList,则可以创建如下:
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() | 此方法用于返回Java中ArrayList的浅表副本。 |
| contains? (Object o) | 如果此列表包含指定元素,则返回true。 |
| ensureCapacity?(int minCapacity) | 如有必要,增加ArrayList实例的容量,以确保其至少能够容纳由最小容量参数指定的元素数。 |
| forEach?(Consumer super E> 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?() | 返回此列表中的元素数。 |
| subList?(int fromIndex, int toIndex) | 返回此列表中指定的 fromIndex(含)和 toIndex(不含)之间的部分视图。 |
| spliterator?() | 创建一个晚期绑定和快速失败的Spliterator,用于遍历此列表中的元素。 |
| subList?(int fromIndex, int toIndex) | 返回此列表中指定fromIndex(包括)和toIndex(不包括)之间部分的视图。 |
| toArray() | 此方法用于按正确顺序返回包含列表中所有元素的数组。 |
| toArray(Object[] O) | 此方法用于以与前一个方法相同的正确顺序返回包含此列表中所有元素的数组。 |
| trimToSize() | 此方法用于将ArrayList实例的容量修剪为列表的当前大小。 |
注意: 你也可以创建一个通用的 ArrayList:
// 创建一个整型 ArrayList
ArrayList<Integer> arrli = new ArrayList<Integer>();
ArrayList 的一些关键点
- ArrayList是一个以下划线数据结构为基础的可变大小数组或可增长数组。
- ArrayList允许存在重复的元素。
- 插入顺序会被保存。
- 允许存在异构对象。
- 允许插入空对象。
_让我们来看看如何在 ArrayList 上执行一些基本操作,如上所述,我们将在实现每个操作的同时进一步讨论它们。 _
- 将元素添加到列表 / 添加元素
- 更改元素 / 设置元素
- 删除元素 / 删除元素
- 迭代元素
- 获取元素
- 在两个数字之间添加元素
- 排序元素
- ArrayList 的大小
ArrayList 中的操作
1. 添加元素
要将元素添加到 ArrayList 中,我们可以使用 add() 方法。该方法被重载,基于不同的参数执行多个操作。以下是这些操作:
- add(Object):该方法用于在 ArrayList 的末尾添加一个元素。
- add(int index,Object):该方法用于在 ArrayList 的特定索引处添加一个元素。
以下是以上方法的实现:
// Java 程序:将元素添加到 ArrayList
// 导入所有公用工具类
import java.util.*;
// 主类
class GFG {
// 主驱动程序
public static void main(String args[])
{
// 创建一个字符串类型的数组
ArrayList<String> al = new ArrayList<>();
// 向 ArrayList 添加元素
// 自定义输入
al.add("Geeks");
al.add("Geeks");
// 在特定位置添加元素
al.add(1, "For");
// 打印 ArrayList 中的所有元素
System.out.println(al);
}
}
输出
[Geeks, For, Geeks]
2. 更改元素
在添加元素之后,如果我们想要更改元素,则可以使用 set() 方法。由于 ArrayList 是有索引的,我们想要更改的元素由该元素的索引引用。因此,该方法接受一个索引和需要插入到该索引的元素更新值。
以下是已上述方法的实现:
// Java 程序:更改 ArrayList 中的元素
// 导入所有公用工具类
import java.util.*;
// 主类
class GFG {
// 主驱动程序
public static void main(String args[])
{
// 创建一个字符串类型的 ArrayList 对象
ArrayList<String> al = new ArrayList<>();
// 向 ArrayList 添加元素
// 自定义输入元素
al.add("Geeks");
al.add("Geeks");
// 在特定位置添加元素
al.add(1, "Geeks");
// 打印 Arraylist 中的所有元素
System.out.println("初始 ArrayList " + al);
// 将第一个索引的元素更改
al.set(1, "For");
// 打印更新后的 Arraylist
System.out.println("更新后的 ArrayList " + al);
}
}
输出
初始 ArrayList [Geeks, Geeks, Geeks]
更新后的 ArrayList [Geeks, For, Geeks]
3. 删除元素
为了从ArrayList中移除元素,我们可以使用remove()方法。这个方法是重载的,可以根据不同的参数执行多个操作。它们如下:
- remove(Object): 此方法用于从ArrayList中简单地删除一个对象。如果有多个这样的对象,则会删除第一个出现的对象。
- remove(int index): 由于ArrayList是有索引的,因此此方法采用整数值,它只是删除ArrayList中特定索引处存在的元素。在删除元素后,所有元素都向左移动以填充空格,对象的索引也会更新。
例子:
// Java program to Remove Elements in ArrayList
// Importing all utility classes
import java.util.*;
// Main class
class GFG {
// Main driver method
public static void main(String args[])
{
// Creating an object of arraylist class
ArrayList<String> al = new ArrayList<>();
// Adding elements to ArrayList
// Custom addition
al.add("Geeks");
al.add("Geeks");
// Adding element at specific index
al.add(1, "For");
// Printing all elements of ArrayList
System.out.println("Initial ArrayList " + al);
// Removing element from above ArrayList
al.remove(1);
// Printing the updated Arraylist elements
System.out.println("After the Index Removal " + al);
// Removing this word element in ArrayList
al.remove("Geeks");
// Now printing updated ArrayList
System.out.println("After the Object Removal "
+ al);
}
}
输出
Initial ArrayList [Geeks, For, Geeks]
After the Index Removal [Geeks, Geeks]
After the Object Removal [Geeks]
4. 迭代ArrayList
有多种方式可以通过ArrayList进行迭代。最著名的方法是使用基本的for循环结合get()方法来获取特定索引处的元素,以及使用高级for循环。
例子
// Java program to Iterate the elements
// in an ArrayList
// Importing all utility classes
import java.util.*;
// Main class
class GFG {
// Main driver method
public static void main(String args[])
{
// Creating an Arraylist of string type
ArrayList<String> al = new ArrayList<>();
// Adding elements to ArrayList
// using standard add() method
al.add("Geeks");
al.add("Geeks");
al.add(1, "For");
// Using the Get method and the
// for loop
for (int i = 0; i < al.size(); i++) {
System.out.print(al.get(i) + " ");
}
System.out.println();
// Using the for each loop
for (String str : al)
System.out.print(str + " ");
}
}
输出
Geeks For Geeks
Geeks For Geeks
5. 获取元素
// Java program to get the elemens in ArrayList
import java.io.*;
import java.util.*;
class GFG {
public static void main (String[] args) {
ArrayList<Integer> list = new ArrayList();
// add the number
list.add(9);
list.add(5);
list.add(6);
System.out.println(list);
// get method
Integer n= list.get(1);
System.out.println("at indext 1 number is:"+n);
}
}
输出
[9, 5, 6]
在索引1处的数字是:5
6. 在两个数字之间添加元素
// Java程序,用于添加数组列表中的元素
// 两个数字之间
import java.io.*;
import java.util.*;
class GFG {
public static void main(String[] args)
{
ArrayList<Integer> list = new ArrayList();
list.add(1);
list.add(2);
list.add(4);
System.out.println(list);
// 插入缺失的元素3
list.add(2, 3);
System.out.println(list);
}
}
输出:
[1, 2, 4]
[1, 2, 3, 4]
7. 数组列表排序
// Java程序,用于数组列表排序
import java.io.*;
import java.util.*;
class GFG {
public static void main(String[] args)
{
ArrayList<Integer> list = new ArrayList();
list.add(2);
list.add(4);
list.add(3);
list.add(1);
System.out.println("排序前:");
System.out.println(list);
Collections.sort(list);
System.out.println("排序后:");
System.out.println(list);
}
}
输出:
排序前:
[2, 4, 3, 1]
排序后:
[1, 2, 3, 4]
8. 元素的大小
// Java程序,用于查找数组列表元素的大小
import java.io.*;
import java.util.*;
class GFG {
public static void main(String[] args)
{
ArrayList<Integer> list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
int b = list.size();
System.out.println("大小是:" + b);
}
}
输出:
大小是:4
Java中的ArrayList是Java Collection框架中实现List接口的类。以下是在Java中使用ArrayList的优点和缺点。
ArrayList的优点
- 动态大小:ArrayList可以动态增加和缩小大小,便于根据需要添加或删除元素。
- 易于使用:ArrayList使用简单,是许多Java开发人员的选择。
- 快速访问:ArrayList提供快速访问元素的方式,因为它在内部实现为数组。
- 有序集合:ArrayList保留元素的顺序,允许按添加顺序访问元素。
- 支持空值:ArrayList可以存储空值,在需要表示缺少值的情况下很有用。
ArrayList的缺点
- 比数组慢:对于某些操作,如在列表中间插入元素,ArrayList比数组慢。
- 内存使用量增加:ArrayList需要比数组更多的内存,因为它需要保持其动态大小并处理调整大小。
- 不线程安全:ArrayList不是线程安全的,这意味着多个线程可能同时访问和修改列表,导致潜在的竞争条件和数据损坏。
- 性能降低:当列表中的元素数量增加时,ArrayList的性能可能会下降,特别是对于搜索元素或在列表中间插入元素等操作。
结论
需要记住本文的要点如下:
- ArrayList是集合框架的一部分。它继承了AbstractList类并实现了List接口。
- ArrayList是动态数组的实现。
- ArrayList可以使用不同类型的构造函数进行初始化,如无参数、将集合作为参数、将整数作为参数。
- 在ArrayList中可以执行如下操作:添加、删除、迭代和排序。
ArrayList的常见问题解答
Q1. Java中的ArrayList是什么?
回答:
Java中的ArrayList是集合框架的一部分。它用于存储元素,其大小是可调整的。
Q2. ArrayList中的数据如何存储?
回答:
ArrayList可以存储数据,直到ArrayList的大小已满,此时如果要存储更多的元素,则会将ArrayList的大小加倍。
Q3. ArrayList允许存储重复的值吗?
回答:
是的,ArrayList允许存储重复的值。
极客教程