Java ArrayList的内部工作原理
ArrayList是Java集合框架中实现了List接口的类。它是一种线性结构,按顺序存储和访问每个元素,这是因为它在内部使用动态数组来存储元素。与数组一样,它也允许存储重复的元素。这里的动态数组指的是能够根据需要增长和缩小的数组。在本文中,我们将探讨ArrayList的内部工作原理,展示它在操作过程中如何存储元素并调整大小。
ArrayList在Java中的内部工作原理
正如我们大多数人可能已经知道的,标准数组的长度是固定的。一旦声明和初始化数组,它们就无法增长或缩小,这意味着在指定大小后我们无法添加更多元素。但是,在某些极端情况下,开发人员可能在运行时之前不知道数组所需的大小。在这种情况下,ArrayList作为数组的更好选择,它可以动态增加或减少元素的数量。
ArrayList的构造函数
要在程序中使用ArrayList,我们首先需要创建ArrayList类的一个实例。为此,Java提供了三种不同的构造函数,如下所示:
- ArrayList() :将创建一个空的ArrayList。
-
ArrayList(int capacityInitial) :在这个构造函数中,我们可以传递一个初始容量,将ArrayList可以容纳的元素个数。一旦元素数量达到初始容量,容量可以自动增加。
-
ArrayList(Collection collectionName) :我们还可以使用这个构造函数从另一个集合创建一个ArrayList。
ArrayList为什么是动态的
当我们使用内置方法’add()’将元素添加到ArrayList时,它首先检查数组中是否有足够的空间来存储新元素。如果有足够的空间,它将新元素分配给数组中的下一个可用索引。如果没有足够的空间来存储新元素,它会创建一个具有更大容量的新数组,通常是当前容量的1.5倍,然后将所有现有元素从旧数组复制到新数组,并将新元素分配给新创建的数组中的下一个可用索引。
当我们使用内置方法’remove()’从ArrayList中移除一个元素时,它会将被移除元素后面的所有元素向左移动一个索引。但是,它不会立即缩小数组的大小,而是在大小与容量相比太小时可能进行缩小。
让我们讨论一些示例以更好地理解上述内容。
示例1
下面的示例演示了如何创建和打印Java中ArrayList的元素。
import java.util.*;
public class Example1 {
public static void main(String[] args) {
// Creating arraylist
ArrayList<Integer> araylist = new ArrayList<Integer>();
// Adding elements in arraylist araylist.add(8);
araylist.add(5);
araylist.add(2);
araylist.add(9);
araylist.add(2);
araylist.add(4);
araylist.add(9);
araylist.add(7);
System.out.println("List of elements: " + araylist);
}
}
输出
List of elements: [8, 5, 2, 9, 2, 4, 9, 7]
示例2
在下面的示例中,我们将创建一个带有初始容量的ArrayList,并尝试添加超过指定容量的元素,以展示ArrayList可以动态增长。
import java.util.*;
public class Example2 {
public static void main(String[] args) {
// Creating arraylist with initial capacity of 5
ArrayList<Integer> araylist = new ArrayList<Integer>(5);
// Adding elements in arraylist
araylist.add(80); // 1
araylist.add(15); // 2
araylist.add(23); // 3
araylist.add(9); // 4
araylist.add(12); // 5
// adding more elements
araylist.add(14);
araylist.add(91);
araylist.add(74);
System.out.println("List of elements: " + araylist);
}
}
输出
List of elements: [80, 15, 23, 9, 12, 14, 91, 74]
示例3
在这个示例中,我们将创建一个ArrayList,从HashSet中演示可以将一个集合的元素添加到ArrayList中。在内部,它首先检查传递的集合的大小,然后使用 ‘Arrays.copyOf()’ 方法将元素存储在给定的ArrayList中。
import java.util.*;
public class Example3 {
public static void main(String[] args) {
// Creating a Set
HashSet<Integer> setH = new HashSet<>();
// Adding elements in the Set
setH.add(80);
setH.add(15);
setH.add(23);
setH.add(9);
setH.add(12);
setH.add(14); setH.add(91);
setH.add(74);
// Passing the Set to the ArrayList
ArrayList<Integer> araylist = new ArrayList<>(setH);
// printing the result
System.out.println("List of elements: " + araylist);
}
}
输出
List of elements: [80, 23, 9, 74, 91, 12, 14, 15]
结论
在本文中,我们首先定义了ArrayList,并在下一部分讨论了它的内部工作原理。ArrayList是一个可调整大小的数组,其默认容量为10,可以随着我们向其中添加更多元素而增加。在创建ArrayList时,我们还可以在其构造函数中指定初始容量。