Java集合:关于 LinkedList 的内容盘点

本篇内容包括:LinkedList 的概述、LinkedList 的结构既双向链表实现与LinkedList-Node 结构、LinkedList 的使用(构造方法&常用方法)、关于 Queue 队列的介绍、关于 ArrayList 和 LinkedList 的区别以及算法:翻转链表!

一、LinkedList 概述

LinkedList 是用链表作为数据存储结构的 List 集合,链表数据结构的特点是每个元素分配的空间不必连续,因此链表很适合数据的动态插入和删除,但是其随机访问和遍历速度比较慢。另外,LinkedList还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

LinkedList 是以链表实现的,插入、删除时只需要改变前后两个节点指针指向即可,实现了真正的动态,不需要处理固定容量的问题,但是丧失了随机访问的能力 (索引访问)。

LinkedList 是一个双向链表实现,插入、删除时只需要改变前后两个节点指针指向即可,实现了真正的动态,不需要处理固定容量的问题。LinkedList 在当数据量很大或者操作很频繁的情况下,添加和删除元素时具有比 ArrayList 更好的性能。但在元素的查询和修改方面要弱于ArrayList。

LinkedList 与 ArrayList 一样 LinKedList 也不是线程安全的。


二、LinkedList 的结构

1、双向链表实现

LinKedList 的数据存储是基于双向链表实现。

LinkedList 类每个结点用内部类 Node 表示,LinkedList 通过 firstlast 引用分别指向链表的第一个和最后一个元素,当链表为空时,firstlast 都为 NULL 值。

LinkedList

关于 LinKedList 操作数据时:

  • 插入数据(很快):先是在双向链表中找到要插入节点的位置 index,找到之后,再插入一个新节点。 双向链表查找 index 位置的节点时,有一个加速动作:若 index < 双向链表长度的 1/2,则从前向后查找,否则,从后向前查找;
  • 删除数据(很快):先是在双向链表中找到要插入节点的位置 index,找到之后,进行如下操作:node.previous.next = node.next; node.next.previous = node.previous; node = null ,查找节点过程和插入一样;
  • 获取数据(很慢):每次获取数据都需要从 Head 节点从头开始查找;
  • 遍历数据(很慢):同获取数据一样,每次遍历数据都需要从头开始。

2、LinkedList-Node 结构

LinkedList 类内部的 Node 结点代码如下:

    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;}}

Node 节点一共有三个属性:item 代表节点值,prev 代表节点的前一个节点,next 代表节点的后一个节点。每个结点都有一个前驱和后继结点,并且在 LinkedList 中也定义了两个变量分别指向链表中的第一个和最后一个结点。


三、LinkedList 的使用

1、构造方法

方法名方法说明
public LinkedList()此构造函数用于构造一个空列表。
public LinkedList(Collection<? extends E> c)此构造函数将按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表

2、常用方法_作为队列(Linked继承了Queue)

方法名方法说明
boolean add(E e)此方法将指定的元素追加到此列表/队列的末尾
E remove()此方法检索并删除此列表的头部(第一个元素),如果此列表为空,则报错
E removeFirst()此方法删除并返回此列表中的第一个元素,如果此列表为空,则报错
E removeLast()此方法检索并删除此列表的最后一个元素,如果此列表为空,则报错
E poll()此方法检索并删除此列表的头部(第一个元素)
E pollFirst()此方法检索并删除此列表的第一个元素,如果此列表为空,则返回null
E pollLast()此方法检索并删除此列表的最后一个元素,如果此列表为空,则返回null
E element()此方法检索但不删除此列表的头部(第一个元素)

3、常用方法_作为栈(FILO 先进后出的栈)

方法名方法说明
void push(E e)此方法将元素推送到此列表所表示的堆栈上
E pop()此方法从此列表表示的堆栈中弹出一个元素
E peek()此方法检索但不删除此列表的头部(第一个元素)
E peekFirst()此方法检索但不删除此列表的第一个元素,如果此列表为空,则返回null
E peekLast()此方法检索但不删除此列表的最后一个元素,如果此列表为空,则返回null

4、常用方法_作为链表

方法名方法说明
void add(int index, E e)此方法将指定的元素插入此列表中的指定位置。
E remove(int index)此方法删除此列表中指定位置的元素
E remove(Object o)此方法从该列表中删除指定元素的第一个匹配项(如果存在)
E set(int index, E e)此方法使用指定的元素替换此列表中指定位置的元素
E get(int index)此方法返回此列表中指定位置的元素
E getFirst()此方法返回此列表中的第一个元素
E getLast()此方法返回此列表中的最后一个元素
int size()此方法返回此列表中的元素数
boolean contains(Object o)如果此列表包含指定的元素,则此方法返回true
boolean isEmpty()如果此列表为空,则此方法返回true
int indexOf(Object o)此方法返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1
int lastIndexOf(Object o)此方法返回此列表中指定元素最后一次出现的索引,如果此列表不包含该元素,则返回-1
void clear()此方法将从此列表中删除所有元素
Object clone()此方法返回返回此LinkedList的浅表副本
Object[] toArray()此方法以适当的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组
<T> T[] toArray(T[] a)此方法以适当的顺序(从第一个元素到最后一个元素)返回包含此列表中所有元素的数组,返回数组的运行时类型是指定数组的运行时类型

四、相关知识点

1、关于 Queue 队列

队列(Queue):也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。

FIFO 队列

这和我们日常生活中的排队是一致的,最早排队的也是最早离队的。其操作的特性是先进先出(First In First Out, FIFO),故又称为先进先出的线性表。基本上,一个队列就是一个先入先出(FIFO)的数据结构

在Java 中 Queue 接口与 List、Set 同一级别,都是继承了 Collection 接口。LinkedList 实现了 Deque 接口。

2、关于 ArrayList 和 LinkedList 的区别

在结构上,ArrayList 底层是数组,在内存上是连续的;LinkedList 底层是双向链表,在内存上是不连续的

在性能上,ArrayList 由于内存上连续,支持随机查询,查询速度更快,但是在增删时由于会涉及到,数据的移动和数组的扩容,往往是要慢于 LinkedList 的,但并不绝对,可以提前设置好足够的数组空间,并采用尾插的方式

3、算法:翻转链表

假设链表为 1→2→3→∅,我们想要把它改成 ∅←1←2←3。

在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。

class Solution {public ListNode reverseList(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) {ListNode next = curr.next;curr.next = prev;prev = curr;curr = next;}return prev;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle迁移父子数据

现有需求如下&#xff0c;业务组织单元表中id字段数据在另外一个系统全部重复&#xff0c;但需要将此业务单元组织导入另一系统 业务组织单元表Isc_Specialorg_Unit 表中存在ID字段为子节点数据&#xff0c;parent_id为父节点数据&#xff0c;orgpath为组织路径 现在做如下操…

oracle表空间

概念 表空间和数据文件 ●表空间是逻辑存储概念&#xff0c;一个表空间是一个或多个数据文件的逻辑集合 ●存储对象(表、索引)逻辑的存储在表空间上&#xff0c;而存储对象的数据物理的存放在数据文件上 ●数据库至少需要一个叫做system的表空间&#xff0c;也就是系统表空间 ●…

oracle日志

日志分类 redo log files联机日志或重做日志 archived log files归档日志 1184198alert log files 告警日志 trace files user_ _dump_ _dest 用户信息日志如跟踪会话日志 background dump_ dest进程日志还有其他一-些不常用的日志 v$database的log_mode 数据库归档模式…

MySQL:分库分表知识点盘点

本篇内容包括&#xff1a;数据库瓶颈、分库分表以及分库分表相关问题 一、数据库瓶颈 不管是IO瓶颈&#xff0c;还是CPU瓶颈&#xff0c;最终都会导致数据库的活跃连接数增加&#xff0c;进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是&#xff0c;可用…

oracle的sga

sga SGA的管理 ■有三种方式&#xff1a; ●8i:SGA的总大小由所有内存组件大小之和决定&#xff0c;不能直接定义SCA大小。对内部组件大小的修改必须在数据库重起 后 才能生为&#xff0c;所以叫做SGA的静态管理。 ●9i&#xff…

MySQL:主从相关知识点盘点

本篇内容包括&#xff1a;MySQL 主从复制简介、主从复制的原理以及主从搭建 一、MySQL 主从复制简介 在实际的生产中&#xff0c;为了解决Mysql的单点故障已经提高MySQL的整体服务性能&#xff0c;一般都会采用**「主从复制」**。 比如&#xff1a;在复杂的业务系统中&#x…

oracle导出expdp

expdp/impdp 是 oracle 10g 版本后推出的服务器端工具--数据泵&#xff0c;作用是为了将数据库中的逻辑对象&#xff0c;比如表、用户、全库、表空间进 行导入&#xff0c;导出 命令解析 ATTACH ATTACH [[schema_name.]job_name] schema_name 表示用户名,job_name 表示导出的作…

oracle检查点

检 查 点 概述 ■l当修改数据时&#xff0c;需要首先将数据读入内存中&#xff08;Buffer Cache&#xff09;&#xff0c;修改数据的同时&#xff0c;Oracle会记录重做信息&#xff08;Redo&#xff09;用于恢复。因 为有了重做信息的存在&#xff0c;Oracle不需要在提交时…

文献翻译:Java theory and practice: Fixing the Java Memory Model, Part 2

Java theory and practice: Fixing the Java Memory Model, Part 2 译&#xff1a;Java 理论与实践&#xff1a;修复 Java 内存模型&#xff0c;第 2 部分 翻译自&#xff1a;http://www.ibm.com/developerworks/library/j-jtp03304/&#xff08;原文写于2004年3月&#xff0…

常用系统函数oracle

单行函数日期函数ADD_MONTHS(date, n):用于从一个日期值增加或减少一些月份 MONTHS_BETWEEN(date1, date2):判断两个日期之间相差的月份 LAST_DAY(date): 函数返回包含日期的月份的最后一天 ROUND(date[,fmt]): 将日期d按照fmt指定的格式舍入&#xff0c;fmt为字符串 TRU…

oracle游标

游标&#xff08;cursor &#xff09;是一个私有的SQL工作区域,是一个指向上下文区的句柄或指针&#xff0c;位于内存中的 "临时表"。 游标是SQL的一个内存工作区&#xff0c;由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某…

系统学习SpringFramework:Spring IOC

本篇内容包括&#xff1a;IOC 和 DI 的概念、Spring 容器&#xff0c;即 BenaFactory 与 AplicationConext 等 IOC 相关内容。 一、IOC 和 DI 的概念 1、IOC IoC&#xff08;Inversion of control &#xff09;即“控制反转”&#xff0c;它是一种设计思想而非一个技术实现。…

rowid

ROWID的格式rowidOOOOOOFFFBBBBBBRRR说明数据对象号相对文件号数据块号行号 上述表格是Oracle 9i及以上版本数据库中的rowid格式: 6位对象号3位相对文件号6位数据块号3位行号&#xff0c;是一个18位的64进制值。这个18位的64进制值在数据库内却是以10个bytes合计80个bit的二进制…

系统学习SpringFramework:循环依赖与三级缓存

本篇内容包括&#xff1a;Spring 中的循环依赖问题&#xff08;包括 Spring 中的循环依赖问题和Spring 中的循环依赖的 5 种场景的介绍&#xff09;、Spring 三级缓存介绍、4 个 Spring 无法自动解决的循环以来场景以及其对应的手动解决方式。 一、Spring 中的循环依赖问题 1、…

深入理解Java虚拟机:Java类的加载机制

本篇内容包括&#xff1a;Java 类的加载机制&#xff08;Jvm 结构组成、Java 类的加载&#xff09;、类的生命周期&#xff08;加载-验证-准备-解析-初始化-使用-卸载&#xff09;、类加载器 以及 双亲委派模型。 一、Java 类的加载机制 1、 Jvm 结构组成 Jvm 整体组成可分为…

新版谷歌浏览器开启Flash支持

浏览器地址栏中输入chrome://version查看Chrome浏览器、Flash插件的版本信息。 Chrome 69.0-70.0版本Chrome 71.0-74.0及以后版本谷歌浏览器地址栏中输入【chrome://flags/#enable-ephemeral-flash-permission】&#xff0c;将【Enable Ephemeral Flash Permissions】从【Defau…

深入理解Java虚拟机:Java垃圾回收机制

本篇内容包括&#xff1a;JAVA 垃圾回收机制概述、有哪些内存需要回收、如何回收&#xff08;标记-清除、标记-整理&#xff08;标记-清除-压缩&#xff09;、复制&#xff08;标记-复制-清除&#xff09;、分代收集等算法&#xff09; 以及 何时进行垃圾回收等内容&#xff01…

深入理解Java虚拟机:Java垃圾回收器

本篇内容包括&#xff1a;7 种 Jvm 垃圾回收器的介绍、对比 以及 对应的 Jvm 参数设置&#xff0c;这 7 种包括了&#xff1a;Serial、ParNew 以及 Parallel Scavenge 三种新生代回收器 和 &#xff1a;Serial Old、Parallel Old 以及 CMS 三种老年代回收器&#xff0c;此外还有…

网络协议:什么是网络分层的七四五

本篇内容包括&#xff1a;网络分层七层、五层、四层网络协议概念的介绍&#xff0c;IOS 体系结构的介绍与构成、TCP/IP体系结构的简介及与IOS体系的关系 以及五层体系结构的介绍。 一、七层、五层、四层网络协议概念 1、关于网络协议 网络协议&#xff0c;即是指计算机网络中…