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

yizhihongxing

对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中,可以通过多种方式读取外部资源,比如文件、网络数据等。本篇攻略将介绍Java中常用的读取外部资源的方法及实例代码。 读取本地文件 1. 使用 FileInputStream FileInputStream 是一个用来打开文件以进行读取操作的类。下面是使用 FileInputStream 读取本地文件的方…

    Java 2023年5月19日
    00
  • Java执行cmd命令的举例与注意事项

    Java执行cmd命令的举例与注意事项 在Java程序中,执行cmd命令是常见的需求之一。本攻略将介绍如何在Java中执行cmd命令,并列出注意事项。 执行cmd命令的方法 Java中可以通过Runtime.getRuntime().exec()方法来执行cmd命令。该方法返回一个Process对象,通过该对象可以获得命令的执行结果。下面是执行cmd命令的模…

    Java 2023年5月27日
    00
  • Spring boot整合Mybatis实现级联一对多CRUD操作的完整步骤

    下面是“Spring boot整合Mybatis实现级联一对多CRUD操作的完整步骤”的攻略。 一、准备工作 首先,需要搭建好Spring Boot项目,并将Mybatis集成到项目中。可以参考官方文档。然后,需要确保数据库中有两张表,一张父表和一张子表。例如,下面是一个父表和一个子表的示例: 父表 student: | id | name | | —-…

    Java 2023年5月20日
    00
  • 关于JDBC的简单封装(实例讲解)

    下面我将详细讲解“关于JDBC的简单封装(实例讲解)”的完整攻略。 1. JDBC 简介 Java Database Connectivity (JDBC) 是一组用于在 Java 编程语言中连接和操作标准数据库的 API。其中,JDBC API 提供了 Java 应用程序与各种关系数据库的连接接口,如 MySQL、Oracle、PostgreSQL 等等。…

    Java 2023年6月16日
    00
  • Java Spring分别实现定时任务方法

    Java Spring 是一个开源的全栈轻量级应用框架,可以通过 Spring 框架实现定时任务即在指定时间轮询执行某个任务或在固定时间执行某个任务。下面详细介绍一下 Java Spring 分别实现定时任务的方法: 1. Spring Schedule 注解方式 这种方法主要使用在方法上添加注解,从而使得方法在特定的时间点或者时间间隔执行。 在Spring…

    Java 2023年6月1日
    00
  • UniApp + SpringBoot 实现微信支付和退款功能

    UniApp 是一款跨平台的移动应用开发框架,通常可同时构建出 iOS 和 Android 应用。SpringBoot 是一款流行的 Java Web 开发框架,提供了快速搭建 web 应用的能力。通过结合起来,可以实现微信支付和退款功能。 第一步:注册微信开发者账号 如果没有微信开发者账号,需要手动注册一个。注册成功后,需要进行微信支付相关的配置,包括商户…

    Java 2023年5月23日
    00
  • Java详解使用线程池处理任务方法

    Java详解使用线程池处理任务方法 线程池 线程池是一种重复利用线程资源的机制,线程池中预先创建一定数量的线程,当有任务需要执行时,直接使用一个线程来执行任务,当任务执行完毕后,线程不会立即销毁,而是返回线程池中,等待下一次任务的执行。这样可以避免线程频繁创建和销毁带来的开销,提高程序的运行效率。 线程池的使用 创建线程池 Java中提供了线程池的实现,我们…

    Java 2023年5月18日
    00
  • Tomcat源码解析之Web请求与处理

    Tomcat源码解析之Web请求与处理 前言 Tomcat 是一个流行的Web应用服务器,也是一个开源项目。对于二次开发者,学习Tomcat的源码是非常有益的。本文将对Tomcat的Web请求与处理进行深入的源码解析。 一、Tomcat的主要入口 Tomcat的Http处理入口是由org.apache.catalina.core.StandardHostVa…

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