Java ArrayList的内部工作原理

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时,我们还可以在其构造函数中指定初始容量。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程