对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日

相关文章

  • 序列化版本号serialVersionUID的作用_动力节点Java学院整理

    序列化是Java中非常重要且常用的一个功能。它在实现网络通信、分布式存储等方面都有广泛的应用。而序列化版本号serialVersionUID则是保证序列化的兼容性和稳定性的重要手段,它用于判断序列化对象的版本是否一致,如果不一致则不能反序列化。 在Java中,每个class都有一个serialVersionUID属性,它是一个长整型数字。如果不显式指定,Ja…

    Java 2023年5月20日
    00
  • 【深度思考】聊聊JDK动态代理原理

    1. 示例 首先,定义一个接口: public interface Staff { void work(); } 然后,新增一个类并实现上面的接口: public class Coder implements Staff { @Override public void work() { System.out.println(“认真写bug……”); } } …

    Java 2023年4月17日
    00
  • Java中常见的编码集问题总结

    Java中常见的编码集问题总结 什么是编码集 编码集是一种翻译表,能将字符集中的字母、数字和符号对应到磁盘或内存中存储的比特序列。不同的编码集使用不同的比特序列来表示相同的字符。 常见的编码集有ASCII、UTF-8、GB2312等。 Java中处理编码集的方法 Java中处理编码集主要使用的是String类和Java的字符编码转换器Charset。 Str…

    Java 2023年5月20日
    00
  • 通过Spring Shell 开发 Java 命令行应用

    通过Spring Shell开发Java命令行应用,可以帮助我们方便地搭建一个强大的命令行应用程序,可以实现命令解析、命令补全等功能。下面是通过Spring Shell开发Java命令行应用的完整攻略: 1. 添加依赖 首先,我们需要在pom.xml中添加必要的依赖,这些依赖包含Spring Shell框架、Spring Boot框架和其他相关依赖: &lt…

    Java 2023年6月2日
    00
  • Java顺序表实现图书管理系统

    让我详细讲解一下“Java顺序表实现图书管理系统”的完整攻略。 概述 顺序表是一种简单、易于实现的数据结构,在实现图书管理系统时,可以用来存储图书信息,如书名、作者、出版社、出版日期等。本文将介绍如何使用Java语言实现顺序表来完成一个简单的图书管理系统。 步骤 1.定义Book类 首先,我们需要定义一个Book类来表示图书信息。该类包含以下属性: 书名(S…

    Java 2023年5月30日
    00
  • Slf4j+logback实现JSON格式日志输出方式

    实现JSON格式日志输出方式需要使用Slf4j和logback两个工具,下面是详细攻略: 1.引入依赖 在项目的pom.xml文件中添加如下依赖: <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId>…

    Java 2023年5月26日
    00
  • Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)复现

    以下是Apache ActiveMQ任意文件写入漏洞(CVE-2016-3088)的完整攻略: 漏洞介绍 Apache ActiveMQ是一款开源的消息队列系统。当使用ActiveMQ的fileserver和http服务时,可以利用该漏洞将任意文件写入至任意路径,从而造成远程代码执行。 漏洞编号:CVE-2016-3088漏洞评级:高危 环境搭建 首先需要搭…

    Java 2023年6月15日
    00
  • 老生常谈Java反射机制(必看篇)

    老生常谈Java反射机制(必看篇) 什么是Java反射机制? Java反射机制是Java提供的一种能够在运行时获取对象的信息以及修改对象的内容的方法。通过反射机制,程序可以获取任意一个类的内部信息,并且可以操作类、构造器、方法、成员变量等。 反射机制的应用场景 通过配置文件来读取实例化的对象 对框架类进行扩展 调试时查看对象的属性信息 反射机制的基本用法 获…

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