【Java】LinkedList 集合

LinkedList集合特点

LinkedList 底层基于双向链表实现增删 效率非常高,查询效率非常低。


LinkedList源码解读分析

  1. LinkedList 是双向链表实现的 List
  2. LinkedList 是非线程安全的(线程是不安全的)
  3. LinkedList 元素允许为null,允许重复元素
  4. LinkedList 是基于链表是实现的,因此插入删除效率高(如果根据下标增删 效率还是非常低的),查询效率低
  5. LinkedList 是基于链表实现的,因此不存在容量不足的问题,所以没有扩容的方法
  6. LinkedList 还是实现了栈和队列的操作方法,因此也可以作为栈、队列和双端队列来使用


示例代码:

package com.collection.Demo08;import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;public class Test01 {public static void main(String[] args) {/*** LinkedList 底层基于链表实现 增删 效率非常高 查询效率是非常低*/List<String> linkedList = new LinkedList<>();linkedList.add("mayikt1");linkedList.add("mayikt2");linkedList.add("mayikt3");linkedList.get(0);/*** LinkedList get()底层是如何实现的呢?* 底层基于双向链表实现*/System.out.println(linkedList.size());Iterator<String> iterator = linkedList.iterator();while (iterator.hasNext()){System.out.println(iterator.next());}System.out.println("===删除之后===");linkedList.remove(1);Iterator<String> iterator2 = linkedList.iterator();while (iterator2.hasNext()){System.out.println(iterator2.next());}}
}
package com.collection.Demo08;import java.util.LinkedList;public class Test02 {public static void main(String[] args) {LinkedList<String> strings = new LinkedList<>();strings.add("mayikt01");strings.add("mayikt02");strings.add("mayikt03");strings.remove(0);System.out.println(strings.get(0));//mayikt01System.out.println(strings.getFirst());//mayikt01System.out.println(strings.getLast());//mayikt03}
}

 手写LinkedList集合

package com.collection.Demo08;/*** LinkedList底层是基于链表实现* 手写LinkedList集合*/public class MayiktLinkedList<E> {private Node<E> first;//第一个节点private Node<E> last; //最后一个节点int size = 0; //LinkedList存放的元素个数private static class Node<E> {private E item;//当前节点的值private Node<E> prev;//上一个节点private Node<E> next;//下一个节点
//        transient Node<E> next;// transient表示next节点不能够被序列化的/*** @param prev 当前节点的上一个节点* @param item 当前节点的值* @param next 当前节点的下一个节点*/public Node(Node<E> prev, E item, Node<E> next) {this.item = item;this.prev = prev;this.next = next;}}public void add(E e) {//add()创建一个新的node节点时,新的node节点的上一个节点是还未新增时的last尾节点Node l = last;//获取当前链表中最后一个节点//创建一个新的node节点//newNode节点的上一个节点,就是当前链表中的最后一个节点Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null) {//如果在链表中没有最后一个节点的话——链表为空first = newNode;} else {l.next = newNode;}size++;}/*** 根据index 查询 链表中对应的node节点* 对半查找*/Node<E> node(int index) {if (index < size >> 1) { //size >>1 =>size/2//查询链表中间值的左边Node<E> f = first;for (int i = 0; i < index; i++) {f = f.next;}return f;} else {//查询链表中间值的右边Node<E> l = last;for (int i = size - 1; i > index; i--) {l = l.prev;}return l;}}public E get(int index) {//下标如果越界的话 需要抛出异常return node(index).item;}//根据下标查询public E remove(int index) {return unlink(node(index));}private E unlink(Node<E> node) {//1.根据index 查询对应的node节点,时间复杂度为O(n)//2.删除链表效率非常高,比arrayList效率高,因为arrayList需要移动数组,而链表只需修改prev,next的指向问题//获取删除的node节点 上一个和下一个node节点final E element = node.item;//获取删除节点元素值Node<E> prev = node.prev;//删除节点的上一个节点Node<E> next = node.next;//删除节点的下一个节点//如果删除的节点 上一个节点为空if (prev == null) { //删除的该节点是头节点first = next;} else {prev.next = next;node.prev = null;//改为null,是为了通知GC 回收}if (next == null) {//删除的该节点是尾节点last = prev;} else {next.prev = prev;node.next = null;}node.item = null;//改为null,是为了通知GC 回收size--;return element;}public static void main(String[] args) {MayiktLinkedList<String> stringMayiktLinkedList = new MayiktLinkedList<>();stringMayiktLinkedList.add("mayikt01");stringMayiktLinkedList.add("mayikt02");stringMayiktLinkedList.add("mayikt03");stringMayiktLinkedList.add("mayikt04");stringMayiktLinkedList.remove(1);System.out.println(stringMayiktLinkedList.get(0));System.out.println(stringMayiktLinkedList.get(1));
//        System.out.println(stringMayiktLinkedList.get(2));
//        System.out.println(stringMayiktLinkedList.get(3));}
}

下一篇文章:

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

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

相关文章

2023版 STM32实战12 IIC总线读写AT24C02

IIC简述 一个多主从的串行总线&#xff0c;又叫I2C&#xff0c;是由飞利浦公司发明的通讯总线 IIC特点 -1- 串行(逐bit传输) -2- 同步(共用时钟线) -3- 半双工(收发不同进行) -4- 总线上的任何设备都可以是主机 开发使用习惯和理解 -1- 通过地址寻址 -2- 数据线的…

Ubuntu20.04下安装MySQL8环境

Ubuntu20.04下安装MySQL8环境 1.下载MySQL客户端和服务器2.配置MySQL3.测试MySQL4.设置MySQL服务开机自启动5.修改root密码MySQL数据库基本使用启动MySQL数据库服务重启MySQL数据库服务停止MySQL数据库服务查看MySQL运行状态设置MySQL服务开机自启动停止MySQL服务开机自启动MyS…

[Linux]线程池

[Linux]线程池 文章目录 [Linux]线程池线程池的概念线程池的优点线程池的应用场景线程池的实现 线程池的概念 线程池是一种线程使用模式。线程池是一种特殊的生产消费模型&#xff0c;用户作为生产者&#xff0c;线程池作为消费者和缓冲区。 线程过多会带来调度开销&#xff0c…

系统架构设计师-第16章-嵌入式系统架构设计理论与实践-软考学习笔记

嵌入式系统( Embedded System) 是为了特定应用而专门构建的计算机系统&#xff0c;其架构是随着嵌入式系统的逐步应用而发展形成的。嵌入式软件架构的设计与嵌入式系统的体系架构是密不可分的。因此&#xff0c;本常首先介绍嵌入式系统硬件相关知识&#xff08;系统特征、硬件组…

在docker中创建EMQX 加数据卷

1、从虚拟容器中复制出来文件 docker run --rm emqx/emqx:5.3.0 sh -c cd /opt/emqx && tar -c etc | tar -C $PWD -x 2、将这三个文件夹分别赋予最高权限&#xff0c;也可以777可以755 chmod -R 777 data chmod -R 777 etc chmod -R 777 log 3、创建容器代码 docke…

透明安全地解释Moonbeam基金会分配的GLMR去了哪

在GLMR分配比例中&#xff0c;约有16.7%的GLMR分配给了生态支持。这部分GLMR究竟用在了哪里&#xff0c;Moonbeam生态是否还有足够的GLMR扶持生态项目&#xff1f; Moonbeam基金会每隔半年会发布一份GLMR透明度报告&#xff0c;最近的报告日期为2023年7月31日。其中列出了社区…

加解密原理(HCIA)

一、加密技术 1、加密的两个核心组件 2、加密技术作用&#xff1a; 二、加解密技术原理 1、对称加密 2、非对称加密 &#xff08;1&#xff09;思考问题&#xff1f; 1&#xff09;、有了非对称加密为什么还用对称加密&#xff1f; 2&#xff09;、如何传递秘钥呢&…

【23种设计模式】里氏替换原则

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

C#:枚举是命名的整形常量的集合

在枚举&#xff08;enum&#xff09;中&#xff0c;整形常量指的是一组预定义的整数值&#xff0c;它们代表了枚举类型中的不同取值。这些整数值通常用于表示特定的状态、选项或标识符。 枚举类型是一种自定义的数据类型&#xff0c;它可以用于定义一组相关的命名常量。每个枚…

服务器动态/静态/住宅/原生IP都是什么意思

​  在互联网的世界中&#xff0c;我们经常会听到关于IP地址的各种说法&#xff0c;比如服务器动态IP、静态IP、住宅IP和原生IP。那么这些术语究竟代表着什么意思呢?让我们一起来了解一下。 动态IP 动态IP(Dynamic IP)是指互联网服务提供商(ISP)在每次用户上网时&#xff0c…

Redis中的数据类型以及适用场景

1.Redis中的数据类型 Redis中的数据类型包括&#xff1a;String(字符串&#xff09;、Hash(字典)、List(列表)、Set(集合)、Sorted Set【Zset】(有序集合&#xff09;。 Redis 所有的数据结构都是一个key对应一个value&#xff0c;不同类型的数据结构之间的差异就在于value的…

【微信小程序开发】学习小程序的网络请求和数据处理

前言 网络请求是微信小程序中获取数据和与服务器交互的重要方式。微信小程序提供了自己的API来处理网络请求&#xff0c;使得开发者可以轻松地在微信小程序中实现数据的获取和提交。本文将介绍微信小程序中的网络请求&#xff0c;包括使用wx.request发起GET和POST请求&#xf…

jenkins实践篇(1)——基于分支的自动发布

问题背景 想起初来公司时&#xff0c;我们还是在发布机上直接执行发布脚本来运行和部署服务&#xff0c;并且正式环境和测试环境的脚本都在一起&#xff0c;直接手动操作脚本时存在比较大的风险就是将环境部署错误&#xff0c;并且当时脚本部署逻辑还没有检测机制&#xff0c;…

JVM面试知识点整理

文章目录 (一) JVM组成JVM组成部分和运行流程从图中可以看出 JVM 的主要组成部分运行流程&#xff1a;程序计数器Java堆虚拟机栈方法区堆栈的区别是什么&#xff1f; (二) 类加载器双亲委派模型类装载的执行过程 (三) 垃圾回收对象什么时候可以被垃圾回收哪些可以作为根对象 垃…

【QT】Qt控件不显示图标

问题描述 本人在跟着B站视频学习QT时&#xff0c;遇到了一件十分悲惨的事情&#xff0c;一模一样的步骤&#xff0c;我的图标却不能显示。 于是我上网查询一下解决方案&#xff0c;第一种&#xff0c;亲测没用&#xff1b;第二种亲测可以。 解决方法一 1、构建 -> 清理项目…

ArcGIS Maps SDK for JS:隐藏地图边框

文章目录 1 问题描述2 解决方案 1 问题描述 近期&#xff0c;将ArcGIS Api for JS v4.16更新到了ArcGIS Maps SDK for JS v4.27&#xff0c;原本去除地图的css代码失效了。 v4.26及以前版本 &#xff0c;需要用.esri-view-surface--inset-outline:focus::after 控制边框属性。…

基于docker的Mysql版本升级

引言 随着版本的迭代和漏洞的提出&#xff0c;Mysql作为一款软件避免不了打补丁的命运。 由于docker版本的升级教程较少&#xff0c;以下基于docker版本的MySQL升级说明。 以下操作均在本地虚拟机中操作验证。 使用runlike查看启动脚本 镜像与镜像的差距就在启动命令的区别…

假如我有一台服务器,我会让它提供三种服务

一、提供照片上传、存储和下载服务 随着移动互联网时代的持续快速发展&#xff0c;PC互联网日益势微&#xff0c;各大互联网门户网站的博客、空间也跟着凋零&#xff0c; 作为博客、空间的标配功能的相册也随之被关闭。 2019年3月6日网易相册发布停运公告并于当年5月8日正式停…

基于RK3568高性价比全国产EMS储能解决方案(二)设计方案

目录 版 本 修 订 记 录 1. 产品介绍 1.1. 什么是XM3568-EP 1.2. 产品特点 1.3. 外壳尺寸 1.4. 外壳外观 1.5. 规格参数 2. 设备使用介绍 2.1. 下载需要使用到的驱动和调试工具 2.2. 启动网关 2.3. DEBUG串口的使用方法 2.4. LED指示灯说明 3. Linux系…

0029Java程序设计-家政服务平台管理系统

文章目录 摘要目录系统设计开发环境 摘要 本文首先研究并介绍国内外目前的背景和现状&#xff0c;在此基础上给出论文的主要研究内容&#xff0c;其次&#xff0c;对家政服务平台管理系统的需求进行了分析。再次&#xff0c;对家政服务平台管理系统进行了总体设计&#xff0c;…