对ArrayList和LinkedList底层实现原理详解

对ArrayList和LinkedList底层实现原理详解

ArrayList

简介

ArrayList是基于动态数组实现的,其最大的特点就是可以随机访问,这也是数组的一个最大优点。另外,ArrayList支持在尾部快速添加元素的操作,当然,如果要在中间插入、删除元素,这是需要移动数组元素,所以操作速度会相对比较慢,并且,在ArrayList中,如果进行了大量的移动元素的操作,这会导致性能下降。

实现原理

ArrayList的底层是一个Object类型的数组,当一个数组对象被创建时,其默认大小为10,我们可以通过构造方法或add等方法进行扩容。每次扩容,容量会翻倍,也可以指定容量大小。可以看下面的示例代码:

ArrayList<String> list = new ArrayList(20);

这里创建了一个初始容量为20的ArrayList。

示例说明

添加元素

ArrayList支持在尾部快速添加元素的操作,我们可以使用该类提供的add()方法进行添加,代码如下:

ArrayList<Integer> list = new ArrayList<>(2);
list.add(1);
list.add(2);

上述代码中,我们创建了一个初始容量为2的ArrayList,添加了1和2两个元素。再看下面的代码:

list.add(3);

上述代码执行后,ArrayList的长度会变成3,同时在数组的第三个位置添加新元素3。

随机访问

ArrayList是基于动态数组实现的,其最大的特点就是可以随机访问,我们可以使用get()方法在ArrayList中访问特定位置的元素,代码如下:

list.get(2); //获取第三个元素

上述代码会返回ArrayList中的第三个元素的索引值,注意索引是从0开始的。

LinkedList

简介

LinkedList是基于链表实现的,其最大的优点就是在中间插入、删除元素时速度非常快,因为只需要改变待操作元素的前驱或后继节点指针即可,而不需要像ArrayList一样移动数组元素。当然,LinkedList无法像ArrayList一样随机访问,必须从头节点开始遍历到指定节点才行。同时,在LinkedList中,在添加、删除元素时,并不需要移动数组元素,所以其性能相对比较稳定。

实现原理

LinkedList的底层是一个双向链表,每个节点保存有前驱节点和后继节点的引用,同时,LinkedList中还有一个指向链表头部和链表尾部的头节点和尾节点的引用。

示例说明

添加元素

LinkedList支持在尾部快速添加元素的操作,我们可以使用该类提供的add()方法进行添加,代码如下:

LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);

上述代码中,我们创建了一个名为list的LinkedList,添加了1和2两个元素。再看下面的代码:

list.add(3);

上述代码执行后,LinkedList的元素个数变成3,同时在链表的尾部添加一个新节点,节点值为3。

中间插入、删除元素

LinkedList在中间插入、删除元素时,速度非常快。我们依然可以使用add()、remove()方法进行操作,例如代码如下:

LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);

list.add(1, 10);//在第二个位置添加元素10

list.remove(0);//在第一个位置删除元素1

上述代码中,我们首先创建了一个名为list的LinkedList,并添加了1、2、3三个元素。接着,在第二个位置插入元素10,即1、10、2、3。删除列表中的第一个元素1。

总结

ArrayList和LinkedList都有自己的优点和缺点,这取决于具体的应用场景。如果需要进行大量随机访问操作,那么应该选择ArrayList;如果需要进行大量中间插入、删除操作,那么应该选择LinkedList。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:对ArrayList和LinkedList底层实现原理详解 - Python技术站

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

相关文章

  • Java分布式锁的三种实现方案

    让我来详细讲解“Java分布式锁的三种实现方案”的完整攻略。 什么是分布式锁? 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,多个节点会竞争同一个锁,这个锁可以是基于数据库或者基于缓存等其他方式实现的。 Java分布式锁的三种实现方案 基于数据库的分布式锁 这种锁的实现方式比较简单,通过数据库的行锁来实现分布式锁,通过insert或…

    Java 2023年5月26日
    00
  • 对象的销毁过程包括哪些步骤?

    对象的销毁过程是指当一个对象不再被需要时,系统如何对其进行销毁和回收相关资源的过程。在Java中,所有对象都是由垃圾回收器自动进行垃圾回收和销毁的。 对象的销毁过程包括以下步骤: 及时调用对象的finalize()方法,释放占用的资源。finalize()方法是一个由垃圾回收器在销毁对象之前调用的方法,可以在该方法中释放占用的资源,例如关闭文件、释放内存等。…

    Java 2023年5月10日
    00
  • Java 数组详解及示例代码

    Java 数组详解及示例代码 什么是数组 数组(Array)是由相同类型的数据按照一定的顺序排列而成的集合,是Java程序设计中最基本的数据结构之一。 在Java中,数组可以看成是一种容器,可以存放多个同类型的数据。其中每个数据被称为元素(Element),而在数组中,每个元素可以通过一个编号(Index)进行唯一标识。 创建数组 在Java中,创建数组有两…

    Java 2023年5月23日
    00
  • Java的JSTL标签库详解

    Java的JSTL标签库详解 什么是JSTL JSTL是Java服务器标准标签库的简称,它是在Java Web开发中常用的JSP标签扩展库。JSTL的主要作用是为JSP页面提供扩展标签集,它们封装了常用的JSP页面动作,比如条件语句、循环语句等,可以让我们开发Web应用更加简单、高效、可维护。 JSTL的分类 JSTL根据其功能分为五个类型: Core 标签…

    Java 2023年5月26日
    00
  • 在小程序中推送模板消息的实现方法

    推送模板消息是小程序中常用的一种通知方式,可以用于告知用户订单状态变更、提醒用户使用小程序等。在小程序中推送模板消息的实现方法,可以总结为以下步骤: 步骤一:准备模板 在推送模板消息前,需要先准备好消息模板,模板可以通过微信公众平台或开放平台申请。申请模板时需要填写模板的标题、关键词及示例,同时需要将申请的模板ID记录下来,在推送模板消息时使用。 申请模板的…

    Java 2023年5月30日
    00
  • 关于Ubuntu Server 18.04 LTS 安装Tomcat并配置systemctl管理Tomcat服务的问题

    下面是详细的攻略: 环境准备 确保已经安装了Java环境,Tomcat需要依赖Java运行 sudo apt install default-jdk 下载Tomcat 可以在官网下载Tomcat https://tomcat.apache.org/download-90.cgi。 这里以apache-tomcat-9.0.52.tar.gz为例,在终端中执行…

    Java 2023年6月2日
    00
  • Spring Data JDBC介绍及实现代码

    Spring Data JDBC 是 Spring Framework 的一个子项目,它通过简化数据持久化操作来降低开发人员的工作量。Spring Data JDBC 不同于其他的 ORM 框架,它并不需要实体类与表间的映射,而是基于传统的 JDBC 封装来进行操作,并且支持 SQL 和存储过程的调用。 Spring Data JDBC 的使用包含以下几个步…

    Java 2023年5月20日
    00
  • WEB常见漏洞问题危害及修复建议

    WEB常见漏洞问题危害及修复建议 1. 漏洞问题概述 WEB常见漏洞是指在Web应用程序的设计、开发、运维、维护等各个环节中可能存在的安全隐患。常见的Web安全漏洞有SQL注入、跨站脚本攻击、文件包含漏洞、不安全文件上传、恶意重定向、Session劫持、CSRF攻击等。 这些漏洞问题会造成以下危害: 数据丢失或数据泄露:攻击者可能会利用这些漏洞访问、修改、删…

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