ArrayList在Java中的内部工作原理
ArrayList是Java Collection Framework中实现List接口的类。它是一个线性结构,顺序存储和访问每个元素,这是因为它内部使用动态数组来存储其元素。与数组一样,它也允许存储重复元素。这里的动态数组是指能够根据需要增长和收缩的数组。在本文中,我们将探讨 ArrayList 的内部工作原理,以展示它如何存储其元素并在操作期间调整自身大小。
ArrayList 在 Java 内部如何工作?
我们大多数人都知道标准数组是固定长度的。一旦数组被声明并初始化,它们就不能增长或收缩,这意味着我们在指定其大小后不能添加更多元素。但是,在一些极端情况下,开发人员可能直到运行时才知道所需的数组大小。在这种情况下,ArrayList 是数组的更好替代方案,它可以动态增加或减少元素的数量。
ArrayList 的构造函数
要在我们的程序中使用ArrayList,我们首先需要创建ArrayList类的实例。为此,Java 提供了下面提到的三种不同的构造函数:
ArrayList():它将创建一个空的ArrayList。
ArrayList(intcapacityInitial):在此构造函数中,我们可以传递 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>(); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>// Adding elements in arraylist<span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(8); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(5); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(2); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(9); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(2); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(4); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(9); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(7); <span style="font-size: 11.4844px;"> </span>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 <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>ArrayList<Integer> araylist = new ArrayList<Integer>(5); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>// Adding elements in arraylist <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(80); // 1 <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(15); // 2 <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(23); // 3 <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(9); // 4 <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(12); // 5 <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>// adding more elements <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(14); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(91); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>araylist.add(74); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>System.out.println("List of elements: " + araylist); } }
输出
List of elements: [80, 15, 23, 9, 12, 14, 91, 74]
示例 3
在此示例中,我们将从 HashSet 创建一个 ArrayList,以演示可以将一个集合的元素添加到 ArrayList。在内部,它首先检查传递的集合的大小,然后使用“Arrays.copyOf()”方法将元素存储在给定的 ArrayList 中。
import java.util.*; public class Example3 { public static void main(String[] args) { <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>// Creating a Set <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>HashSet<Integer> setH = new HashSet<>(); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>// Adding elements in the Set <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>setH.add(80); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>setH.add(15); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>setH.add(23); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>setH.add(9); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>setH.add(12); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>setH.add(14);<span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>setH.add(91); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>setH.add(74); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>// Passing the Set to the ArrayList <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>ArrayList<Integer> araylist = new ArrayList<>(setH); <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>// printing the result <span style="font-size: 0.875em; font-weight: var(--bs-body-font-weight);"> </span>System.out.println("List of elements: " + araylist); } }
输出
List of elements: [80, 23, 9, 74, 91, 12, 14, 15]
结论
我们通过定义 ArrayList 开始本文,在下一节中,我们讨论了它的内部工作原理。 ArrayList 是一个可调整大小的数组,其默认容量为 10,当我们向其中添加更多元素时,可以增加该容量。我们还可以在创建 ArrayList 时在其构造函数中指定初始容量。
以上就是ArrayList在Java中的内部工作原理的详细内容,更多请关注其它相关文章!