一、前言

在 Java 编程中,我们经常需要使用数据结构来存储和操作数据集合。其中两种常用的数据结构是 ArrayList 和 LinkedList。虽然它们都可以用来存储一系列元素,但它们之间存在一些关键差异。本文将探讨这些差异,并帮助您根据具体需求选择最合适的数据结构。

二、各自介绍

ArrayList

ArrayList 是基于数组实现的可变大小列表。它在内部维护了一个对象数组,并提供了许多方法来添加、删除和搜索元素。由于它基于数组,所以随机访问非常快,时间复杂度为 O(1)。

特点:

  • 随机访问:由于使用了数组,因此可以通过索引直接访问任何元素。
  • 插入和删除操作:在列表中间插入或删除元素相对较慢,因为这可能需要移动大量元素(平均时间复杂度为 O(n))。
  • 内存使用:除了实际数据之外,ArrayList 还需要额外的空间来存储每个元素的索引信息。

LinkedList

LinkedList 是一个双向链表实现,每个元素都包含指向其前一个和后一个元素的引用。这种结构使得插入和删除操作非常高效,因为只需要更新前后元素的引用即可。

特点:

  • 插入和删除操作:在列表中的任何位置插入或删除元素都非常快(时间复杂度为 O(1)),因为只需要改变相邻节点的指针即可。
  • 随机访问:要访问特定位置的元素,必须从头节点开始遍历到该位置,这意味着随机访问的时间复杂度为 O(n)。
  • 内存使用:每个节点都需要额外的内存来存储前后节点的引用,但这通常比 ArrayList 需要的额外空间少。

性能考量

  • 随机访问:如果您的应用程序需要频繁地通过索引访问元素,则 ArrayList 更适合。
  • 频繁插入和删除:如果您需要频繁地在列表的任意位置插入或删除元素,那么 LinkedList 可能是更好的选择。
  • 内存使用:对于内存敏感的应用程序,需要考虑每种数据结构的额外开销。


三、项目实践

1.添加元素

package com.example.springbootdemo.test;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class ListDemo {
    public static void main(String[] args) {
        List<Integer> arrayList = new ArrayList<>();
        List<Integer> linkedList = new LinkedList();

        //添加元素
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            arrayList.add(i);
        }
        System.out.println("ArrayList need time: " + (System.currentTimeMillis() - startTime));

        //添加元素
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            linkedList.add(i);
        }
        System.out.println("LinkedList need time: " + (System.currentTimeMillis() - startTime));


    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.

运行结果:

我们该使用ArrayList还是LinkedList?_ArrayList

2.查询数据

package com.example.springbootdemo.test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

public class ListDemo {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        LinkedList<Integer> linkedList = new LinkedList();

        //添加元素
        for (int i = 0; i < 100000; i++) {
            arrayList.add(i);
        }

        //添加元素
        for (int i = 0; i < 100000; i++) {
            linkedList.add(i);
        }


        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            arrayList.get(i);
        }
        System.out.println("ArrayList need time: " + (System.currentTimeMillis() - startTime));


        startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            linkedList.get(i);
        }
        System.out.println("LinkedList need time: " + (System.currentTimeMillis() - startTime));
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.

运行结果:

我们该使用ArrayList还是LinkedList?_LinkedList_02

四、总结

在选择 ArrayList 或 LinkedList 时,需要考虑您的应用的具体需求。如果您需要快速随机访问和较少的插入删除操作,那么 ArrayList 是更好的选择。相反,如果您需要频繁地在列表中插入或删除元素,那么 LinkedList 将提供更佳的性能。