java集合总结:
ArrayList详解_Allence的博客-CSDN博客一、介绍ArrayList是以什么数据结构实现的ArrayList底层的数据结构是顺序表。顺序表:物理内存上连续、逻辑上连续、大小可以动态扩展顺序表是由数组实现的,说道这里就理一下数组、链表、顺序表之间的关系。逻辑结构:结构定义中是对操作对像的数学描述,描述的是数据元素之间的逻辑关系。例如,线性结构,树形结构,图状结构或网状结构。它们都属于逻辑结构。物理结构:又称存储结构,是数据结构在计算机中的表示(又称映像)。例如,数组,指针。线性表:属于逻辑结构中的线性结构,它包括顺序表和链表。https://blog.csdn.net/m0_37707561/article/details/122527303
一、linkedList的数据结构
linkedList数据结构是线性表,底层由双向链表实现
二、linkedList源码分析
1.linkedList继承的类和实现的接口分别什么作用
(1).linkedList继承的AbstractSequentialList和实现的List接口作用
AbstractSequentialList继承的AbstractList,所以和ArrayList一样本质就是实现增删改查还有Iterator的功能
(2).linkedList实现的Deque接口作用
Deque是双端队列,它继承自Queue队列,Queue继承集合
说到队列我们复习一下队列这个数据结构:
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。我认为linkedList虽然实现了Deque接口,但是它不是一个队列,它只是具有一些队列的特性,严格的队列是不允许在中间直接插入元素的,只能在队尾插入,所以想把一个元素插入到中间只能从队头全出队然后重新入队在入队的时候插入。
关于队列数据结构好的文章:
数据结构与算法—队列图文详解 - bigsai - 博客园前言 前言 栈和队列是一对好兄弟,前面我们介绍过数据结构与算法—栈详解,那么栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出口,只能后进先出(在外面的先出去)。而队列就好比是一个隧道https://www.cnblogs.com/bigsai/p/11363071.html(3).Cloneable
实现了这个接口才能用Object的clone方法,详细的看Java集合总结的ArrayList
(4).Serializable
可以序列化了,详细的看Java集合总结的ArrayList
2.源码中重要的字段和方法
(1).长度
transient int size = 0;
(2).双向链表的首节点、尾节点
transient Nodefirst;
transient Nodelast;
为什么不用序列化,因为序列化的时候会把整个链表都存起来,读取的时候取第一个就是first节点,最后一个就是last节点,不用单独再去存储
(3).链表的节点数据结构
private static class Node{ E item; Node next; Node prev; Node(Node prev, E element, Node next) { this.item = element; this.next = next; this.prev = prev; } }
上一个节点的指针 prev,下一个节点的指针next,和当前节点的数据item
(4).无参构造
public linkedList() {
}
(5).参数为集合的构造
public linkedList(Collection extends E> c) {
this();
addAll(c);
}
(6).在头部插入一个节点
private void linkFirst(E e) {
final Node f = first;
final Node newNode = new Node<>(null, e, f);
first = newNode;
if (f == null)
last = newNode;
else
f.prev = newNode;
size++;
modCount++;
}
主要是指针操作和维护size、modCount
指针操作:final Node
final Node
判断如果f是null说明是一个空集合。那first和last都是刚创建的newNode节点
如果f不为null,把f的前驱prev指向newNode,这样就达到了f.prev是newNode和newNode.next是f
成功的在头部插入了一个节点newNode
维护size++集合长度加一,modCount++对集合结构修改的行为加一。
modCount的作用请看:ArrayList详解
(7).在链表的尾部插入一个节点
void linkLast(E e) {
final Node l = last;
final Node newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
和在头部插入一个节点相反,这里就不再重复说,注意一点这是双向链表



