LinkedList源码分析

博客先强调学习技术要能证明所学,接着介绍Java集合,对比集合与数组区别,阐述集合中map、list、set类型差异,重点讲解LinkedList,包括其双向链表结构、在包中的位置、继承实现的接口、全局变量,还列举了常用方法及原理,鼓励深入学习技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天和别人聊天时,有所感慨。 自己辛辛苦苦的学了不少东西。  但是谁又能相信我是真的学过,真的努力了呢。能拿出什么证据出来吗。

学过的东西要说的出来,证明自己是学过了的。不然你去面试的时候,跟面试官说你学了xxx技术,他会相信你说的话吗。

 

在提到LinkedList之前我们先来说说什么是集合,集合和数组之前的区别。

百度百科中说到,集合类是Java数据结构的实现。Java的集合类是java.util包中的重要内容,它允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法。

那么集合和数组之前的区别又是什么?

1.集合的容量大小是可变的,数组的容量大小是不可变的。

2.集合存储的是引用数据类型,数组存储的是基础数据类型和引用数组类型。

3.集合的数据结构是顺序表,链表,哈希表,树等,而数组只有数据表结构

4.集合是以类的形式存在,具有封装,继承,多态等特性。而数组没有。

参考博客:https://blog.csdn.net/weixin_48512144/article/details/107289664

我们都知道java的集合有两种,一种是键值对类型,一种是非键值对类型。

也就是map类型 和list,set类型。

list和set是继承了Collection接口的,而map没有。

那么list和set有什么区别呢

list是有序的,set是无序的。list是可重复的,set是不重复的。

list又分为很多种,比如线程不安全的ArrayList,LinkedList,还有线程安全的,比如读写锁结构的CopyOnWriterArrayList和不常用的Vector等。

ArrayList属于动态数组结构,查询快,增删慢。

而LinkedList是双向链表结构,增删快,查询慢。

也就是说LinkedList不存在初始值一说。

双向链表是什么,和单向链表有什么区别?

双向链表是链表前后都可以添加元素,而单向链表只能往后添加元素

 

好像说跑题了,下面来正式说说LinkedList

我们在看一个类的源码时,首先都是要先看这个类在哪个包,继承了哪个类或者实现了哪个接口

LinkedList是支持泛型的,在java.util工具包下

继承了AbstractSequentialList类,实现了List,Aeque,Cloneable,Serializable接口

也就是说LinkedList是支持序列化的

 

我们再来看看LinkedList中的全局变量

有这三个

 


长度,首节点,最后一个节点。

transient关键字我们也都知道,是禁止序列化的一个关键字。

然后一些构造方法和不常用的方法在这里我就不说了,大家可以自己去看。

 

 

注意:有的方法我没有写参数值

 

getFirst() :获取首节点

 

原理: 如果头节点为null会抛出NoSuchElementException,否则返回头节点自身的值

getLast() :获取尾节点

原理:如果尾节点为null,抛出NoSuchElementException异常,否则返回尾节点自身的值

removeFirst() :删除头节点

原理:

removeLast() :删除尾节点


addFirst(): 添加首节点

addLast(): 添加尾节点

contains(): 是否包含某个对象

size(): 获取集合长度


add(): 添加元素

remove(): 删除元素

addAll():添加全部集合元素

clear(): 清空集合

get(int index): 根据下标获取集合元素


set(int index, E element): 修改带下标的集合元素

add(): 添加带下标的集合元素

remove(int index): 根据下标 删除元素

 

 

大家平时在学习一些技术时,不要只停留在会用,要知其然,还要知其所以然。

希望大家多多努力,加油,机会是留给有准备的人的。

 

 

 

 

 

 

LinkedList是Java中提供的一个双向链表实现类,其内部维护了一个first和last节点,分别表示链表的头和尾。以下是LinkedList源码分析: 1. 声明LinkedList类 ```java public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { transient int size = 0; transient Node<E> first; transient Node<E> last; } ``` 2. 声明Node类 ```java private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } } ``` 3. 实现LinkedList的方法 - add(E e)方法:将元素添加到链表末尾 ```java public boolean add(E e) { linkLast(e); return true; } void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; } ``` - add(int index, E element)方法:将元素插入到指定位置 ```java public void add(int index, E element) { checkPositionIndex(index); if (index == size) linkLast(element); else linkBefore(element, node(index)); } void linkBefore(E e, Node<E> succ) { final Node<E> pred = succ.prev; final Node<E> newNode = new Node<>(pred, e, succ); succ.prev = newNode; if (pred == null) first = newNode; else pred.next = newNode; size++; } ``` - remove(int index)方法:删除指定位置的元素 ```java public E remove(int index) { checkElementIndex(index); return unlink(node(index)); } E unlink(Node<E> x) { final E element = x.item; final Node<E> next = x.next; final Node<E> prev = x.prev; if (prev == null) { first = next; } else { prev.next = next; x.prev = null; } if (next == null) { last = prev; } else { next.prev = prev; x.next = null; } x.item = null; size--; return element; } ``` - get(int index)方法:获取指定位置的元素 ```java public E get(int index) { checkElementIndex(index); return node(index).item; } Node<E> node(int index) { if (index < (size >> 1)) { Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } } ``` 以上就是LinkedList源码分析,通过对其源码的分析,我们可以更深入地理解链表的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值