JavaSE——集合4:List接口实现类—LinkedList

news2024/11/29 13:01:35

目录

一、LinkedList的全面说明

二、LinkedList的底层操作机制

(一)LinkedList添加结点源码

(二)LinkedList删除结点源码 

三、LinkedList常用方法

四、ArrayList与LinkedList的选择 


一、LinkedList的全面说明

  1. LinkedList底层实现了双向链表和双端队列的特点
  2. 可以添加任意元素(元素可以重复),包括null
  3. 线程不安全,没有实现同步和互斥

二、LinkedList的底层操作机制

  1. LinkedList底层维护了一个双向链表
  2. LinkedList中维护了两个属性first和last,分别指向首节点和尾节点
  3. 每个节点(Node对象),里面又维护了prev、next、item三个属性,其中通过prev指向前一个,通过next指向后一个节点。最终实现双向链表
  4. 所以LinkedList元素的添加和删除,不是通过数组完成的,相对来说效率较高

(一)LinkedList添加结点源码

1. LinkedList linkedList = new LinkedList();
   public LinkedList() {}
2. 这时 linkeList 的属性 first = null  last = null
3. 执行 添加
    public boolean add(E e) {
         linkLast(e);
         return true;
     }
4.将新的结点,加入到双向链表的最后
  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++;
     modCount++;
 }

(二)LinkedList删除结点源码 

linkedList.remove(); // 这里默认删除的是第一个结点

1. 执行 removeFirst
  public E remove() {
      return removeFirst();
  }
2. 执行
  public E removeFirst() {
      final Node<E> f = first;
      if (f == null)
          throw new NoSuchElementException();
      return unlinkFirst(f);
  }
3. 执行 unlinkFirst, 将 f 指向的双向链表的第一个结点拿掉
  private E unlinkFirst(Node<E> f) {
      // assert f == first && f != null;
      final E element = f.item;
      final Node<E> next = f.next;
      f.item = null;
      f.next = null; // help GC
      first = next;
      if (next == null)
          last = null;
      else
          next.prev = null;
      size--;
      modCount++;
      return element;
  }

三、LinkedList常用方法

        因为LinkedList也继承了Collection和List,所以List的方法也适用于LinkedList。

  1. add()
  2. remove()    // 默认删除第一个结点
  3. removeFirst()
  4. removeLast()
  5. set(索引值,插入的元素)
  6. get(索引值)
public static void main(String[] args) {
    LinkedList linkedList = new LinkedList();
	linkedList.add(1);
	linkedList.add(2);
	linkedList.add(3);
	linkedList.add("");
	linkedList.add(" ");
	linkedList.add(' ');
	linkedList.add(null);
	linkedList.add(null);
	System.out.println("linkedList=" + linkedList);
	// linkedList=[1, 2, 3, ,  ,  , null, null]

	// remove默认删除第一个结点
	linkedList.remove();
	System.out.println("linkedList=" + linkedList);
	// linkedList=[2, 3, ,  ,  , null, null]

	// 修改某个结点对象
	linkedList.set(1, 999);
	System.out.println("linkedList=" + linkedList);
	// linkedList=[2, 999, ,  ,  , null, null]

	// 得到某个结点对象
	// get(1) 是得到双向链表的第二个对象
	Object o = linkedList.get(1);
	System.out.println(o); // 999

	// 因为LinkedList 是 实现了List接口, 遍历方式
	System.out.println("===LinkeList遍历迭代器====");
	Iterator iterator = linkedList.iterator();
	while (iterator.hasNext()) {
		Object next = iterator.next();
		System.out.println("next=" + next);
	}
	// next=2
	// next=999
	// next=
	// next=
	// next=
	// next=null
	// next=null

	System.out.println("===LinkeList遍历增强for====");
	for (Object o1 : linkedList) {
		System.out.println("o1=" + o1);
	}
	// next=2
	// next=999
	// next=
	// next=
	// next=
	// next=null
	// next=null

	System.out.println("===LinkeList遍历普通for====");
	for (int i = 0; i < linkedList.size(); i++) {
		System.out.println(linkedList.get(i));
	}
	// 2
	// 999
	//
	//
	//
	// null
	// null
}

四、ArrayList与LinkedList的选择 

底层结构增删的效率改查的效率
ArrayList可变数组较低;底层依赖数组扩容较高;根据数组索引查找
LinkedList双向链表较高;底层通过链表追加较低;在链表中从头到尾遍历

如何选择ArrayList与LinkedList:

  1. 如果改查的操作多,选择ArrayList
  2. 如果增删的操作多,选择LinkedList
  3. 一般来说,80%-90%都是查询,因此大部分情况下会选择ArrayList
  4. 根据业务灵活选择,也可能一个模块使用的是ArrayList,另一个模块使用LinkedList。

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

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

相关文章

【热门】用ChatGPT做智慧农业云平台——农业ERP管控系统

随着科技的进步,原有农业种植方式已经不能满足社会发展的需要,必须对传统的农业进行技术更新和改造。经过多年的实践,人们总结出一种新的种植方法——温室农业,即“用人工设施控制环境因素,使作物获得最适宜的生长条件,从而延长生产季节,获得最佳的产出”。这种农业生产方式…

“智改数转”转了什么?

万界星空科技专门针对数字化改造申报的MES系统具有显著的技术优势和实施效果&#xff0c;能够为制造型企业提供全方位、高效、可靠的数字化转型支持。项目合作可以私信或者百度上海万界星空科技官网。 “智改数转”是一个综合性的过程&#xff0c;涉及企业多个方面的转型和升…

随机抽取学号

idea 配置 抽学号 浏览器 提交一个100 以内的整数。&#xff0c;后端接受后&#xff0c;根据提供的整数&#xff0c;产生 100 以内的 随机数&#xff0c;返回给浏览器&#xff1f; 前端&#xff1a;提供 随机数范围 &#xff0c;病发送请求后端&#xff1a;处理随机数的产生&…

C 408—《数据结构》算法题基础篇—链表(下)

目录 Δ前言 一、两个升序链表归并为一个降序链表 0.题目&#xff1a; 1.算法设计思想&#xff1a; 2.C语言描述&#xff1a; 3.算法的时间和空间复杂度&#xff1a; 二、两个链表的所有相同值结点生成一个新链表 0.题目&#xff1a; 1.算法设计思想&#xff1a; 2.C语言描述…

DDD重构-实体与限界上下文重构

DDD重构-实体与限界上下文重构 概述 DDD 方法需要不同类型的类元素&#xff0c;例如实体或值对象&#xff0c;并且几乎所有这些类元素都可以看作是常规的 Java 类。它们的总体结构是 Name: 类的唯一名称 Properties&#xff1a;属性 Methods: 控制变量的变化和添加行为 一…

MySQL中 truncate、drop和delete的区别

MySQL中 truncate、drop和delete区别 truncate 执行速度快&#xff0c;删除所有数据&#xff0c;但是保留表结构不记录日志事务不安全&#xff0c;不能回滚可重置自增主键计数器 drop 执行速度较快&#xff0c;删除整张表数据和结构不记录日志事务不安全&#xff0c;不能回…

JavaWeb——Maven(3/8):配置Maven环境(当前工程,全局),创建Maven项目

目录 配置Maven环境 当前工程 全局 创建Maven项目 配置Maven环境 当前工程 选择 IDEA中 File --> Settings --> Build,Execution,Deployment --> Build Tools --> Maven 设置 IDEA 使用本地安装的 Maven&#xff0c;并修改配置文件及本地仓库路径 首先在 IDE…

QtCreator14调试Qt5.15出现 Launching Debugger 错误

1、问题描述 使用QtCreator14调试程序&#xff0c;Launching Debugger 显示红色&#xff0c;无法进入调试模式。 故障现象如下&#xff1a; 使能Debugger Log窗口&#xff0c;显示&#xff1a; 325^error,msg"Error while executing Python code." 不过&#xff…

【软件推荐】信创终端上通过kshutdown实现定时关机 _ 统信 _ 麒麟 _ 方德

往期好文&#xff1a;【功能介绍】麒麟2403支持配置任务栏上的图标“从不合并”啦&#xff01; Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于如何在信创终端系统上通过kshutdown实现定时关机的文章。在日常使用中&#xff0c;定时关机是一个非常实用的功能&am…

Leetcode 841. 钥匙和房间

1.题目基本信息 1.1.题目描述 有 n 个房间&#xff0c;房间按从 0 到 n – 1 编号。最初&#xff0c;除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而&#xff0c;你不能在没有获得钥匙的时候进入锁住的房间。 当你进入一个房间&#xff0c;你可能会在…

uniapp 微信小程序分包操作

1. 在项目根目录创建一个新的目录&#xff0c;名称为分包名称 2. 打开manifest.json&#xff0c;选择源码视图&#xff0c;加入以下代码 "optimization" : {"subPackages" : true } 3. 在pages.json中&#xff0c;pages后面添加分包代码 "subPackag…

tkinter Listbox 列表框实现多列对齐排列并绑定下拉框和滚动条

from tkinter import * from tkinter import ttk, Button, Canvas, Listbox, Entry, LabelFrame, IntVar, Checkbutton, messageboximport win32print root Tk() root.title("tkinter Listbox 列表框实现多列对齐排列") root.geometry(550x450)def callback2(t, eve…

k8s-对命名空间资源配额

对k8s命名空间限制的方法有很多种&#xff0c;今天来演示一下很常用的一种 用的k8s对象就是ResourceQuota 一&#xff1a;创建命名空间 kubectl create ns test #namespace命名空间可以简写成ns 二&#xff1a; 对命名空间进行限制 创建resourcequota vim resourcequ…

Http请求转发服务器实现

Http请求转发服务器实现 需求场景 云服务器通过VPN连接了现场的n台工控机&#xff0c;每台工控机上都在跑web程序&#xff0c;现在我想通过公网直接访问工控机上的web服务&#xff0c;给客户查看现场的具体运行情况&#xff0c;而不是让客户再装一个VPN&#xff0c;简化操作。…

Axure重要元件三——中继器函数

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;中继器函数 主要内容&#xff1a;Item、Reperter、TargetItem 1、中继器的函数&#xff1a;Item\Reperter\TargetItem Item item&#xff1a;获取…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第五篇-着色器投影-投射阴影部分】

投射阴影 最初打算将投影内容放在上一篇中&#xff0c;因为实现非常快速简单&#xff0c;没必要单独成篇。不过因为这里面涉及一些问题&#xff0c;我觉得还是单独作为一篇讲一下比较好。 原理 这里要用到的是 Shadow Pass Switch ,它可以为非不透明的材质替换阴影 某些版本…

ubuntu22.04下GStreamer源码编译单步调试

前言 本文会通过介绍在linux平台下的GStreamer的源码编译和单步调试example实例。官网介绍直接通过命令行来安装gstreamer可以参考链接&#xff1a;Installing on Linux。 这种方法安装后&#xff0c;基于gstreamer的程序&#xff0c;单步调试的时候并不会进入到gstreamer源码…

架构师:Nginx 实现负载均衡的技术指南

1、简述 NGINX 是一种高性能的 HTTP 服务器和反向代理服务器,广泛应用于 web 服务器场景中。负载均衡是 NGINX 的重要功能之一,能够将请求分发到多个服务器上,提高应用的可用性和性能。 NGINX 负载均衡的主要策略: 轮询 (Round Robin): 将请求依次分发到后端服务器,每个…

中国移动机器人将投入养老场景;华为与APUS共筑AI医疗多场景应用

AgeTech News 一周行业大事件 华为与APUS合作&#xff0c;共筑AI医疗多场景应用 中国移动展出人形机器人&#xff0c;预计投入养老等场景 作为科技与奥富能签约&#xff0c;共拓智能适老化改造领域 天与养老与香港科技园&#xff0c;共探智慧养老新模式 中山大学合作中国…

Web应用程序的设计与前端开发

我们的客户专门从事自动化系统的开发和支持&#xff0c;用于分析、报告、规划和其他业务任务&#xff0c;以及集成外部产品。 任务 我们的客户开始开发一个用于企业业务分析的web应用程序。他们自己处理后端&#xff0c;而我们的团队负责界面和前端。界面不仅在视觉上具有吸引…