likes
comments
collection
share

Java 中的 ArrayList

作者站长头像
站长
· 阅读数 38

Java ArrayList是 Java 集合框架的一部分,它是 java.util 包中的一个类。它为我们提供了 Java 中的动态数组。虽然它可能比标准数组慢,但在需要对数组进行大量操作的程序中很有用。此类位于java.util包中。Java 中 ArrayList 的主要优点是,如果我们声明一个数组,则需要提及大小,但在 ArrayList 中,不需要提及 ArrayList 的大小。如果您想提及大小,那么您可以这样做。

ArrayList是Java中非常常用的数据结构,它实现了一个可变大小的数组列表。与传统的数组不同,ArrayList允许在运行时动态添加或删除元素,而无需预先指定数组大小。

Java 中的 ArrayList 是什么?

ArrayList 是使用 List 接口实现的 Java 类。Java ArrayList,顾名思义,提供动态数组的功能,其大小并不像数组那样固定。此外,作为 Collections 框架的一部分,它具有数组所不具备的许多功能。

Java 中的 ArrayList

主要特点:

  • 动态大小:  ArrayList可以根据需要自动调整大小,无需手动管理数组大小。
  • 随机访问:  与链表不同,ArrayList提供随机访问元素的能力,可以通过索引直接访问任何元素,时间复杂度为O(1)。
  • 插入和删除效率:  在ArrayList的中间插入或删除元素会导致后面的元素进行移动,时间复杂度为O(n)。
  • 线程不安全:  ArrayList不是线程安全的,在多线程环境下使用需要进行同步处理。

插图:

让我们检查一下其中存储了图像的整数对象类型的 ArrayList。

Java 中的 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。看下面的图片:

Java 中的 ArrayList

在上图中,AbstractList、CopyOnWriteArrayList和AbstractSequentialList是实现列表接口的类。每个提到的类都实现了单独的功能。它们是:

  1. *AbstractList: 此类用于实现不可修改的列表,只需扩展此AbstractList类并仅实现get() 和**size() *方法。
  2. **CopyOnWriteArrayList: **该类实现列表接口。它是ArrayList的增强版本,其中所有修改(添加、设置、删除等)都是通过制作列表的新副本来实现的。
  3. **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的一些要点

  1. ArrayList 是带下划线的数据结构可调整大小的数组或可增长的数组。
  2. ArrayList 允许重复。
  3. 插入顺序被保留。
  4. 允许异构对象。
  5. 可以进行空插入。

让我们看看如何对 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 的优点

  1. 动态大小:ArrayList 可以动态地增大或缩小大小,从而可以根据需要轻松添加或删除元素。
  2. 易于使用:ArrayList 使用简单,成为许多 Java 开发人员的热门选择。
  3. 快速访问:ArrayList 提供对元素的快速访问,因为它在底层是作为数组实现的。
  4. 有序集合:ArrayList 保留元素的顺序,允许您按照添加的顺序访问元素。
  5. 支持空值:ArrayList 可以存储空值,这使得在需要表示缺少值的情况下很有用。

Java ArrayList 的缺点

  1. 比数组慢:ArrayList 对于某些操作比数组慢,例如在列表中间插入元素。
  2. 增加内存使用量:ArrayList 比数组需要更多的内存,因为它需要维持其动态大小并处理调整大小。
  3. 非线程安全:ArrayList 不是线程安全的,这意味着多个线程可能同时访问和修改列表,从而导致潜在的竞争条件和数据损坏。
  4. 性能下降:ArrayList 的性能可能会随着列表中元素数量的增加而下降,尤其是搜索元素或在列表中间插入元素等操作。

结论

本文需要记住的要点如下:

  • ArrayList 是 Collections 框架的一部分。它继承了 AbstractList 类并实现了 List 接口。
  • ArrayList 是动态数组的实现。
  • ArrayList 可以使用不同的构造函数类型进行初始化,例如不带参数、将集合作为参数传递以及将整数作为参数传递。
  • 可以在 ArrayList 中执行如下操作:添加、删除、迭代和排序。

ArrayList 常见问题

Java 中的 ArrayList 是什么?

Java 中的 ArrayList 是 Collections 框架的一部分。它用于存储元素,并且大小可调整。

ArrayList 中数据是如何存储的?

ArrayList 可以存储数据直到其大小填满,之后如果我们想要存储更多元素,ArrayList 的大小就会加倍。

ArrayList 允许重复吗?

是的,ArrayList 允许存储重复的值。

转载自:https://juejin.cn/post/7388328892308897826
评论
请登录