当前位置: 首页 > news >正文

ArrayList和LinkedList(常用方法、底层结构及扩容机制)

1.ArrayList解说

ArrayList初始长度为0(这里以jdk1.8为例),是一个Object类型的空数组,如下

 

当第一次调用add后,长度变为10

 

当数组首次扩容的10个空间用完需要扩容后,会第二次走grow方法来扩容(每次扩容为1.5倍)

总的来说:

ArrayList初始大小为10,每次1.5倍进行扩容;它的底层是用数组实现的,所以查询速度相对LinkedList要快。

2.LinkedList解说

(1)* LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
         * LinkedList 实现 List 接口,能对它进行队列操作。
         * LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
         * LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。
         * LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
         * LinkedList 是非同步的。

  由于它的底层是用双向链表实现的,所以它对元素的增加、删除效率要比ArrayList好;它是一个双向链表,没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增就好。

(2)LinkedList底层的数据结构是基于双向循环链表的,且头结点中不存放数据,如下:

                                                 

private transient Entry<E> header = new Entry<E>(null, null, null);
private transient int size = 0;

       header是双向链表的头节点,它是双向链表节点所对应的类Entry的实例。Entry中包含成员变量: previous, next, element。其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点所包含的值。size是双向链表中节点实例的个数。

 

总之,addBefore(E e,Entry<E> entry)实现在entry之前插入由e构造的新节点。而add(E e)实现在header节点之前插入由e构造的新节点。为了便于理解,下面给出插入节点的示意图。

                                                

 

相关文章:

  • HashMap(常用方法、底层结构、扩容机制)
  • 重新认识HashMap(jdk1.8新增特性)
  • HashMap与ConcurrentHashMap
  • 二叉树之B树红黑树AVL树堆积树、B-树、B+
  • springMVC常见面试题
  • mysql性能优化
  • 什么是mysql
  • 数据库三范式
  • io和nio的区别
  • oralce的下载和安装
  • 向oracle中插入图片和读取图片
  • JDK、STS、SVN、Tomcat 、mysql的下载安装及环境变量的配置和sts修改字体大小
  • SM1、SM2 、SM3、 SM4算法
  • 解决java.net.ConnectException: Connection refused:connect报错
  • 密码学和Base64
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Docker 笔记(2):Dockerfile
  • SQLServer之创建数据库快照
  • 翻译--Thinking in React
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 面试遇到的一些题
  • 一、python与pycharm的安装
  • 再次简单明了总结flex布局,一看就懂...
  • 主流的CSS水平和垂直居中技术大全
  • (vue)页面文件上传获取:action地址
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (分布式缓存)Redis哨兵
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (三)elasticsearch 源码之启动流程分析
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • **CI中自动类加载的用法总结
  • .Net core 6.0 升8.0
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .Net7 环境安装配置
  • .NET企业级应用架构设计系列之结尾篇
  • .NET上SQLite的连接
  • .NET值类型变量“活”在哪?
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @javax.ws.rs Webservice注解
  • [20190113]四校联考
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [Android]Tool-Systrace
  • [C/C++] C/C++中数字与字符串之间的转换
  • [C++]AVL树怎么转
  • [HDU 3555] Bomb [数位DP]
  • [IE9] IE9 beta版下载链接
  • [LLM][FT]大模型Fine-Tuning相关技术0
  • [Mvc]在ASP.NET MVC中使用Repeater
  • [nowCoder] 两个不等长数组求第K大数
  • [one_demo_8]十进制转二进制
  • [scikit-learn] 第一章 初识scikit-learn及内置数据集介绍
  • [Spring] IOC控制反转/DI依赖注入详细讲解