Java 中的 ArrayList
Java ArrayList是 Java 集合框架的一部分,它是 java.util 包中的一个类。它为我们提供了 Java 中的动态数组。虽然它可能比标准数组慢,但在需要对数组进行大量操作的程序中很有用。此类位于java.util包中。Java 中 ArrayList 的主要优点是,如果我们声明一个数组,则需要提及大小,但在 ArrayList 中,不需要提及 ArrayList 的大小。如果您想提及大小,那么您可以这样做。
ArrayList是Java中非常常用的数据结构,它实现了一个可变大小的数组列表。与传统的数组不同,ArrayList允许在运行时动态添加或删除元素,而无需预先指定数组大小。
Java 中的 ArrayList 是什么?
ArrayList 是使用 List 接口实现的 Java 类。Java ArrayList,顾名思义,提供动态数组的功能,其大小并不像数组那样固定。此外,作为 Collections 框架的一部分,它具有数组所不具备的许多功能。
主要特点:
- 动态大小: ArrayList可以根据需要自动调整大小,无需手动管理数组大小。
- 随机访问: 与链表不同,ArrayList提供随机访问元素的能力,可以通过索引直接访问任何元素,时间复杂度为O(1)。
- 插入和删除效率: 在ArrayList的中间插入或删除元素会导致后面的元素进行移动,时间复杂度为O(n)。
- 线程不安全: ArrayList不是线程安全的,在多线程环境下使用需要进行同步处理。
插图:
让我们检查一下其中存储了图像的整数对象类型的 ArrayList。
Java ArrayList 示例
**示例 1: **以下实现演示了如何创建和使用 ArrayList,并指出其大小。
Java
` // 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);
}
} `
输出
数组 1:[]
数组 2:[]
数组 1:[1, 2, 3, 4, 5]
数组 2:[1, 2, 3, 4, 5]
上述程序的解释:
ArrayList 是一个动态数组,我们在创建它时不必指定大小,当我们动态添加和删除项目时,数组的大小会自动增加。虽然实际的库实现可能更复杂,但以下是一个非常基本的想法,解释了当数组已满以及我们尝试添加项目时数组的工作方式:
- 在堆内存上创建更大尺寸的内存(例如双倍大小的内存)。
- 将当前内存元素复制到新内存。
- 由于现在有更大的内存可用,因此现在添加了新项目。
- 删除旧记忆。
Java 中 ArrayList 的重要特性
- ArrayList继承了AbstractList类并实现了List接口。
- ArrayList 通过大小进行初始化。但是,如果集合增大,大小会自动增加;如果从集合中删除对象,大小会自动缩小。
- Java ArrayList 允许我们随机访问列表。
- ArrayList 不能用于原始类型,例如 int、char 等。对于这种情况,我们需要一个包装类。
- Java中的ArrayList可以看作是C++中的vector。
- ArrayList 不是同步的。Java 中与它对应的同步类是Vector。
让我们深入了解 Java ArrayList。看下面的图片:
在上图中,AbstractList、CopyOnWriteArrayList和AbstractSequentialList是实现列表接口的类。每个提到的类都实现了单独的功能。它们是:
- *AbstractList: 此类用于实现不可修改的列表,只需扩展此AbstractList类并仅实现get() 和**size() *方法。
- **CopyOnWriteArrayList: **该类实现列表接口。它是ArrayList的增强版本,其中所有修改(添加、设置、删除等)都是通过制作列表的新副本来实现的。
- **AbstractSequentialList: 该类实现了Collection接口和AbstractCollection类。该类用于实现不可修改的列表,只需扩展此AbstractList类并实现get()和size()方法即可。
Java 中 ArrayList 的构造函数
为了创建 ArrayList,我们需要创建 ArrayList 类的对象。ArrayList 类由各种构造函数组成,这些构造函数允许创建数组列表。以下是此类中可用的构造函数:
1. ArrayList()
此构造函数用于构建一个空数组列表。如果我们希望创建一个名为arr 的空 ArrayList ,则可以按如下方式创建:
ArrayList arr = new ArrayList();
2. ArrayList(集合 c)
此构造函数用于构建一个使用集合 c 中的元素初始化的数组列表。假设我们希望创建一个包含集合 c 中存在的元素的 ArrayList arr,那么可以按如下方式创建它:
ArrayList arr = 新 ArrayList (c);
3. ArrayList(int 容量)
此构造函数用于构建指定初始容量的数组列表。假设我们希望创建一个初始大小为 N 的 ArrayList,则可以按如下方式创建:
ArrayList arr = 新 ArrayList(N);
Java ArrayList 方法
**注意: **您还可以创建一个通用的 ArrayList:
// 创建通用整数 ArrayList ArrayList arrli = new ArrayList();
Java中ArrayList的一些要点
- ArrayList 是带下划线的数据结构可调整大小的数组或可增长的数组。
- ArrayList 允许重复。
- 插入顺序被保留。
- 允许异构对象。
- 可以进行空插入。
让我们看看如何对 ArrayList 执行一些基本操作,如所列,我们将在实现每个操作的同时进一步讨论这些操作。
- 将元素添加到列表/添加元素
- 更改元素/设置元素
- 移除元素/删除元素
- 迭代元素
- 获取元素
- 在两个数字之间添加元素
- 对元素进行排序
- ArrayList 大小
ArrayList 中执行的操作
1.添加元素
为了向ArrayList添加元素,我们可以使用add()方法。此方法被重载以根据不同的参数执行多个操作。它们如下:
- add(Object):此方法用于在ArrayList的末尾添加一个元素。
- add(int index, Object):此方法用于在 ArrayList 中的特定索引处添加元素。
下面是上述方法的实现:
Java
// Java Program to Add elements to An ArrayList
// Importing all utility classes
import java.util.*;
// Main class
class GFG {
// Main driver method
public static void main(String args[])
{
// Creating an Array of string type
ArrayList<String> al = new ArrayList<>();
// Adding elements to ArrayList
// Custom inputs
al.add("Geeks");
al.add("Geeks");
// Here we are mentioning the index
// at which it is to be added
al.add(1, "For");
// Printing all the elements in an ArrayList
System.out.println(al);
}
}
输出
[Geeks,Geeks]
2.改变元素
添加元素后,如果我们想更改元素,可以使用set()方法。由于 ArrayList 是索引的,因此我们想要更改的元素由元素的索引引用。因此,此方法采用索引和需要插入到该索引的更新元素。
下面是上述方法的实现:
Java
// Java Program to Change 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 Arraylist object of string type
ArrayList<String> al = new ArrayList<>();
// Adding elements to Arraylist
// Custom input elements
al.add("Geeks");
al.add("Geeks");
// Adding specifying the index to be added
al.add(1, "Geeks");
// Printing the Arraylist elements
System.out.println("Initial ArrayList " + al);
// Setting element at 1st index
al.set(1, "For");
// Printing the updated Arraylist
System.out.println("Updated ArrayList " + al);
}
}
输出
初始 ArrayList [Geeks, Geeks, Geeks]
更新的 ArrayList [Geeks, For, Geeks]
3.删除元素
为了从 ArrayList 中删除元素,我们可以使用remove() 方法。此方法被重载以根据不同的参数执行多个操作。它们如下:
- remove(Object): 此方法用于简单地从 ArrayList 中删除一个对象。如果有多个这样的对象,则删除第一个出现的对象。
- remove(int index): 由于 ArrayList 是索引的,因此此方法采用一个整数值,它只是删除 ArrayList 中该特定索引处的元素。删除元素后,所有元素都会向左移动以填充空间,并且对象的索引会更新。
例子:
Java
// 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);
}
}
输出
初始 ArrayList [Geeks, For, Geeks]
索引删除后 [Geeks, Geeks]
对象删除后 [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
Geeks
5.获取元素
Java
// 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
` // Java program to add the elements
// between two numbers in ArrayList
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);
// insert missing element 3
list.add(2, 3);
System.out.println(list);
}
}
输出
[1, 2, 4]
[1, 2, 3, 4]
7. ArrayList 排序
Java
// Java Program for ArrayList Sorting
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("Before sorting list:");
System.out.println(list);
Collections.sort(list);
System.out.println("after sorting list:");
System.out.println(list);
}
}
输出
排序前列表:
[2, 4, 3, 1]
排序后列表:
[1, 2, 3, 4]
8.元素的大小
Java
// Java program to find the size
// of elements of an ArrayList
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("The size is :" + b);
}
}
输出
尺寸是:4
Java ArrayList 的复杂性
手术 | 时间复杂度 | 空间复杂度 |
---|---|---|
在 ArrayList 中插入元素 | 欧拉(1) | 在) |
从 ArrayList 中删除元素 | 在) | 欧拉(1) |
遍历 ArrayList 中的元素 | 在) | 在) |
替换 ArrayList 中的元素 | 欧拉(1) | 欧拉(1) |
Java 中的 ArrayList 是 Java Collections 框架中实现 List 接口的类。以下是在 Java 中使用 ArrayList 的优点和缺点。
Java ArrayList 的优点
- 动态大小:ArrayList 可以动态地增大或缩小大小,从而可以根据需要轻松添加或删除元素。
- 易于使用:ArrayList 使用简单,成为许多 Java 开发人员的热门选择。
- 快速访问:ArrayList 提供对元素的快速访问,因为它在底层是作为数组实现的。
- 有序集合:ArrayList 保留元素的顺序,允许您按照添加的顺序访问元素。
- 支持空值:ArrayList 可以存储空值,这使得在需要表示缺少值的情况下很有用。
Java ArrayList 的缺点
- 比数组慢:ArrayList 对于某些操作比数组慢,例如在列表中间插入元素。
- 增加内存使用量:ArrayList 比数组需要更多的内存,因为它需要维持其动态大小并处理调整大小。
- 非线程安全:ArrayList 不是线程安全的,这意味着多个线程可能同时访问和修改列表,从而导致潜在的竞争条件和数据损坏。
- 性能下降:ArrayList 的性能可能会随着列表中元素数量的增加而下降,尤其是搜索元素或在列表中间插入元素等操作。
结论
本文需要记住的要点如下:
- ArrayList 是 Collections 框架的一部分。它继承了 AbstractList 类并实现了 List 接口。
- ArrayList 是动态数组的实现。
- ArrayList 可以使用不同的构造函数类型进行初始化,例如不带参数、将集合作为参数传递以及将整数作为参数传递。
- 可以在 ArrayList 中执行如下操作:添加、删除、迭代和排序。
ArrayList 常见问题
Java 中的 ArrayList 是什么?
Java 中的 ArrayList 是 Collections 框架的一部分。它用于存储元素,并且大小可调整。
ArrayList 中数据是如何存储的?
ArrayList 可以存储数据直到其大小填满,之后如果我们想要存储更多元素,ArrayList 的大小就会加倍。
ArrayList 允许重复吗?
是的,ArrayList 允许存储重复的值。
转载自:https://juejin.cn/post/7388328892308897826