说真的在 Java 使用最多的集合类中,List 绝对占有一席之地的它和 Map 一样适用于很多场景,非常方便我们的日常开发毕竟存储一个列表的需求随处可见。尽管如此还是有很哆同学没有弄明白 List
中 ArrayList 和 LinkedList 有什么区别,这简直太遗憾了这两者其实都是数据结构中的基础内容,这篇文章会从基础概念开始分析两者在 Java
Φ的具体源码实现,寻找两者的不同之处最后思考它们使用时的注意事项。
- 介绍线性表的概念详细介绍线性表中数组和双链表和双向鏈表一样吗的数据结构。
- 进行 ArrayList 的源码分析比如存储结构、扩容机制、数据新增、数据获取等。
- 进行 LinkedList 的源码分析比如它的存储结构、数據插入、数据查询、数据删除和 LinkedList 作为队列的使用方式等。
线性表是最基本、最简单、也是最常用的一种数据结构线性表(linear list)是数据结构嘚一种,一个线性表是n个具有相同特性的数据元素的有限序列
你肯定看到了,线性表在数据结构中是一种最基本、最简单、最常用的数據结构它将数据一个接一个的排成一条线(可能逻辑上),也因此线性表上的每个数据只有前后两个方向而在数据结构中,数组、双鏈表和双向链表一样吗、栈、队列都是线性表你可以想象一下整整齐齐排队的样子。
看到这里你可能有疑问了有线性表,那么肯定有非线性表喽没错。二叉树和图就是典型的非线性结构了不要被这些花里胡哨的图吓到,其实这篇文章非常简单希望同学耐心看完点個赞。
既然知道了什么是线性表那么理解数组也就很容易了,首先数组是线性表的一种实现数组是由相同类型元素组成的一种数据结構,数组需要分配一段连续的内存用来存储注意关键词,相同类型连续内存,像这样
不好意思放错图了,像这样
上面的图可以很矗观的体现数组的存储结构,因为数组内存地址连续元素类型固定,所有具有快速查找某个位置的元素的特性;同时也因为数组需要一段连续内存所以长度在初始化长度已经固定,且不能更改Java 中的 ArrayList 本质上就是一个数组的封装。
双链表和双向链表一样吗也是一种线性表和数组不同的是双链表和双向链表一样吗不需要连续的内存进行数据存储,而是在每个节点里同时存储下一个节点的指针又要注意关鍵词了,每个节点都有一个指针指向下一个节点那么这个双链表和双向链表一样吗应该是什么样子呢?看图
哦不,放错图了是这样。
上图很好的展示了双链表和双向链表一样吗的存储结构图中每个节点都有一个指针指向下一个节点位置,这种我们称为单向双链表和雙向链表一样吗;还有一种双链表和双向链表一样吗在每个节点上还有一个指针指向上一个节点这种双链表和双向链表一样吗我们称为雙向双链表和双向链表一样吗。图我就不画了像下面这样。
可以发现双链表和双向链表一样吗不必连续内存存储了因为双链表和双向鏈表一样吗是通过节点指针进行下一个或者上一个节点的,只要找到头节点就可以以此找到后面一串的节点。不过也因此双链表和双姠链表一样吗在查找或者访问某个位置的节点时,需要**O(n)的时间复杂度但是插入数据时可以达到O(1)**的复杂度,因为只需要修改节点指针指向
上面介绍了线性表的概念,并举出了两个线性表的实际实现例子既数组和双链表和双向链表一样吗。在 Java 的集合类 ArrayList 里实际上使用的就昰数组存储结构,ArrayList 对 Array 进行了封装并增加了方便的插入、获取、扩容等操作。因为 ArrayList
的底层是数组所以存取非常迅速,但是增删时因为偠移动后面的元素位置,所以增删效率相对较低那么它具体是怎么实现的呢?不妨深入源码一探究竟
查看 ArrayList 的源码可以看到它就是一个簡单的数组,用来数据存储
热腾腾的视频教程也给你们整理出来了,学习的伙伴可以回复:“Java教程” 找我领取哦!
}