ArrayList在Java中的内部工作原理

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中的内部工作原理的详细内容,更多请关注其它相关文章!