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

相关文章

  • spring异步service中处理线程数限制详解

    Spring异步Service中处理线程数限制详解 异步Service基础知识 在Spring中,我们可以使用@Async注解来定义一个异步方法。这个方法会在调用时在单独的线程中执行,而不是在当前请求线程中执行。 以下是一个简单的示例,演示了如何使用@Async注解: @Service public class MyService { @Async publ…

    Java 2023年5月19日
    00
  • hibernate4快速入门实例详解

    Hibernate4快速入门实例详解 Hibernate是一个基于Java语言的ORM(Object-Relational Mapping)框架,它可以把Java类和关系数据库中的表进行映射,从而可以通过面向对象的方式来操作数据库,使得数据库操作变得更简单、更高效。本文将详细讲解如何快速入门Hibernate4,并提供两个示例说明。 步骤一:环境搭建 在开始…

    Java 2023年6月15日
    00
  • 深入理解TextView实现Rich Text–在同一个TextView设置不同字体风格

    深入理解TextView实现Rich Text的攻略如下: 1. 了解Spannable接口 TextView实现富文本的关键在于使用Spannable接口。Spannable是一个接口,用于控制文本的呈现方式,可以在TextView中实现不同的文本样式。 Spannable接口提供了许多实现富文本的方法,如ForegroundColorSpan、Backg…

    Java 2023年5月26日
    00
  • java 字符串截取的实例详解

    Java 字符串截取的实例详解 在 Java 中,字符串截取是一个很常见的操作,它可以通过字符串的索引来实现。本篇文章将详细讲解 Java 字符串截取的实现方法和相关注意事项。 常用的方法 Java 字符串的截取可以使用 String 类的 substring() 方法,它有两个重载版本,分别是: public String substring(int be…

    Java 2023年5月26日
    00
  • jsp中include指令静态导入和动态导入的区别详解

    JSP中include指令静态导入和动态导入的区别详解 在JSP中,我们可以使用include指令来包含其他的页面。include指令有两种导入方式:静态导入和动态导入。 静态导入 静态导入在JSP编译的时候就会被执行。即将被导入的页面会在编译期间被插入到包含该页面的页面中。因此,被导入的页面不能是动态生成的数据。下面是一个静态导入的示例: <%@ i…

    Java 2023年6月15日
    00
  • 谈谈为JAXB和response设置编码,解决wechat4j中文乱码的问题

    针对“谈谈为JAXB和response设置编码,解决wechat4j中文乱码的问题”,我为你提供以下攻略: 如何为JAXB设置编码 1. 设置XML文件头部 在编写JAXB应用程序时,首先需要设置XML文件头部,以确保正确解析XML内容。通常在XML文件头部加上<?xml version=”1.0″ encoding=”UTF-8″ standalon…

    Java 2023年5月20日
    00
  • jsp输出当前时间的实现代码

    实现jsp输出当前时间需要使用Java中的Date类和SimpleDateFormat类。下面是完整的攻略: 导入相关的类和包 在jsp页面中需要导入以下两个类: <%@ page import="java.util.Date" %> <%@ page import="java.text.SimpleDateF…

    Java 2023年6月15日
    00
  • 在JS中如何调用JSP中的变量

    在JS中如何调用JSP中的变量需要用到以下两步: 在JSP中将要调用的变量声明为JS全局变量 在JS中通过调用全局变量来获取JSP中的变量值 下面我们分别来详细讲解。 1. 声明全局变量 在JSP中,我们需要将要被JS调用的变量声明为全局变量。在JSP中,我们可以使用<script>标签来声明全局变量,例如: <% String name …

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