Java集合ArrayList与LinkedList详解

yizhihongxing

Java集合ArrayList与LinkedList详解

概述

Java集合分为两大类:Collection和Map。其中Collection又可以分为List、Set和Queue三种。

ArrayList和LinkedList是List接口的两种实现类,它们都可以存储按顺序排列的元素,但是它们之间有一些区别。本文将从以下几个方面详细讲解ArrayList和LinkedList的区别:

  1. 数据结构
  2. 插入和删除操作的效率
  3. 随机访问的效率
  4. 内存占用情况

数据结构

ArrayList底层是一个数组,数组的长度是可变的。当数组不够用时,ArrayList会增加数组长度,一般增加原长度的一半。

LinkedList底层是一个双向链表。一个节点包含了当前节点的元素值、前驱节点和后继节点。

插入和删除操作的效率

当需要在List中插入或删除元素时,LinkedList的效率更高。将一个元素插入到ArrayList中,需要先将ArrayList中插入位置后的所有元素依次向后移动一位。同样,如果需要删除元素,需要将删除位置后的所有元素依次向前移动一位。

LinkedList的插入和删除操作更为简单,只需要改变前驱节点和后继节点的指向即可。

以下是插入100000个元素的基准测试结果:

List<Integer> arrayList = new ArrayList<>();
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
    arrayList.add(i);
}
long end = System.currentTimeMillis();
System.out.println("ArrayList: " + (end - start) + " ms");

List<Integer> linkedList = new LinkedList<>();
start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
    linkedList.add(i);
}
end = System.currentTimeMillis();
System.out.println("LinkedList: " + (end - start) + " ms");

结果显示,在插入100000个元素时,ArrayList需要31ms,而LinkedList只需要7ms。

随机访问的效率

在需要使用List的get方法根据索引来访问元素时,ArrayList的效率更高。因为ArrayList底层是一个数组,随机访问是通过索引来实现。而LinkedList是通过遍历前驱节点或后继节点来查找元素,因此访问元素效率较低。

以下是随机访问10000个元素的基准测试结果:

List<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
    arrayList.add(i);
}
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
    arrayList.get(i);
}
long end = System.currentTimeMillis();
System.out.println("ArrayList: " + (end - start) + " ms");

List<Integer> linkedList = new LinkedList<>();
for (int i = 0; i < 10000; i++) {
    linkedList.add(i);
}
start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
    linkedList.get(i);
}
end = System.currentTimeMillis();
System.out.println("LinkedList: " + (end - start) + " ms");

结果显示,在随机访问10000个元素时,ArrayList只需要3ms,而LinkedList需要117ms。

内存占用情况

考虑到Java中的对象模型,一个LinkedList的节点需要存储元素值、前驱节点和后继节点。在存储同样数量的元素时,LinkedList所占用的内存空间通常比ArrayList更大。

示例

以下是使用ArrayList和LinkedList来实现队列的示例程序。

使用ArrayList实现队列

import java.util.ArrayList;

public class ArrayListQueue<T> {
    private ArrayList<T> queue = new ArrayList<>();

    public void push(T item) {
        queue.add(item);
    }

    public T pop() {
        if (queue.isEmpty()) {
            return null;
        }
        return queue.remove(0);
    }

    public int size() {
        return queue.size();
    }

    public boolean isEmpty() {
        return queue.isEmpty();
    }

    public T peek() {
        if (queue.isEmpty()) {
            return null;
        }
        return queue.get(0);
    }
}

使用LinkedList实现队列

import java.util.LinkedList;

public class LinkedListQueue<T> {
    private LinkedList<T> queue = new LinkedList<>();

    public void push(T item) {
        queue.addLast(item);
    }

    public T pop() {
        if (queue.isEmpty()) {
            return null;
        }
        return queue.removeFirst();
    }

    public int size() {
        return queue.size();
    }

    public boolean isEmpty() {
        return queue.isEmpty();
    }

    public T peek() {
        if (queue.isEmpty()) {
            return null;
        }
        return queue.getFirst();
    }
}

可以看到,两种队列实现方式的主要区别在于添加元素和删除元素的方式不同。ArrayList通过add和remove方法,支持在队列头部和尾部插入和删除元素。而LinkedList通过addFirst、removeFirst和addLast、removeLast方法,支持在队列头部和尾部插入和删除元素。

总结

ArrayList适合随机访问和遍历,LinkedList适合插入和删除操作。如果需要在大量数据中进行随机访问,建议使用ArrayList。如果需要频繁地添加和删除元素,则建议使用LinkedList。如果需要同时进行这两种操作,则需要根据具体业务场景选择合适的数据结构。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java集合ArrayList与LinkedList详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • java实现学生成绩档案管理系统

    Java实现学生成绩档案管理系统攻略 系统概述 学生成绩档案管理系统是一个简单的学生成绩管理工具,实现对学生成绩、个人信息的添加、查看、修改和删除等操作。本系统采用Java编写,使用MySQL作为后台数据库。 系统功能 本系统实现以下功能: 添加学生成绩和个人信息 查看学生成绩和个人信息 修改学生成绩和个人信息 删除学生成绩和个人信息 技术准备 开发工具:E…

    Java 2023年5月19日
    00
  • 如何理解Java类装载机制?

    如何理解Java类装载机制 Java类装载机制是Java虚拟机实现面向对象的重要机制之一。在Java中,只有通过类装载机制才能把类的二进制文件加载到内存中。 类加载机制的概念 Java类装载机制指的是Java将类的字节码从硬盘加载到内存中,并进行解析的过程。在Java程序运行期间,类可能会被多次加载、卸载,或者出现别名等情况,这都是由类装载机制所控制的。 类…

    Java 2023年5月11日
    00
  • 如何解决org.apache.jasper.JasperException:无法为JSP编译类详解

    当我们在使用JSP技术开发Web应用程序时,可能会遇到“org.apache.jasper.JasperException: 无法为JSP编译类”的错误。该错误通常是由于Tomcat服务器无法编译JSP文件而引起的。下面是如何解决这个常见问题的完整攻略。 删除缓存文件 Tomcat服务器会将JSP文件编译成Java类并缓存在一个特定的目录中。如果在编译过程中…

    Java 2023年6月15日
    00
  • JPA多数据源分布式事务处理方案

    JPA多数据源分布式事务处理方案需要涉及到以下几个步骤: 配置多数据源 配置事务管理器 编写跨数据源分布式事务代码 具体步骤如下: 配置多数据源 在Spring Boot应用程序中实现多个数据源的方法有很多,这里以使用HikariCP连接池的方式为例。首先在application.properties文件中配置两个数据源: # 第一个数据源 spring.d…

    Java 2023年5月20日
    00
  • hibernate 三种状态的转换

    Hibernate是一个Java语言的ORM(Object-Relational Mapping)框架,用来方便地进行数据库操作。在Hibernate中,每一个对象都有它自己的状态,状态对Hibernate来说非常重要。Hibernate中的实体状态一共有三种,他们是瞬时态、持久态、游离态,下面让我们详细来解释一下这三种状态。 瞬时态 瞬时态是指,一个对象未…

    Java 2023年5月31日
    00
  • mvn compile报错“程序包com.XXX不存在”

    当使用mvn compile命令对Maven项目进行编译时,可能会出现错误提示“程序包com.XXX不存在”的情况。这种错误的产生通常是由于以下两种情况之一: 需要的依赖没有正确添加 本地仓库中缺失相应的依赖包 为了解决这个问题,可以采取以下步骤: 步骤一:确认依赖是否已正确添加 首先需要确认Maven项目的pom.xml文件中是否正确添加了需要的依赖。可以…

    Java 2023年6月2日
    00
  • java实现打印正三角的方法

    下面是Java实现打印正三角的方法的完整攻略。 实现方式 我们可以通过使用循环语句来打印正三角形。具体思路是,先在控制台上输出一个等腰三角形,然后在这个三角形的基础上,按照一定的规则补全缺失的字符,从而实现打印正三角形的效果。 代码实现 以下是Java代码的实现方式: public static void printTriangle(int n) { for…

    Java 2023年5月26日
    00
  • 创建一个Java的不可变对象

    创建一个Java的不可变对象,需要经过以下步骤: 1. 声明类为final 为了防止子类继承和重写类中的方法,将类声明为final。 2. 声明所有的属性为私有的final类型 使用final类型声明属性,并且将其设为私有属性,这样无法修改。 public final class ImmutableObject { private final int age…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部