当前位置: 首页 > news >正文

【Java】LinkedList实现类的使用

LinkedList实现类的使用
  1. package com.star.test04;
  2. import java.util.Iterator;
  3. import java.util.LinkedList;
  4. /**
  5.  * @author : Starshine
  6.  */
  7. public class Test {
  8.     //这是main方法,程序的入口
  9.     public static void main(String[] args) {
  10.         /*
  11.         LinkedList常用方法:
  12.         增加 addFirst(E e) addLast(E e)
  13.              offer(E e) offerFirst(E e) offerLast(E e)
  14.         删除 poll()
  15.             pollFirst() pollLast()  ---》JDK1.6以后新出的方法,提高了代码的健壮性
  16.             removeFirst() removeLast()
  17.         修改
  18.         查看 element()
  19.              getFirst()  getLast()
  20.              indexOf(Object o)   lastIndexOf(Object o)
  21.              peek()
  22.              peekFirst() peekLast()
  23.         判断
  24.          */
  25.         //创建一个LinkedList集合对象:
  26.         LinkedList<String> list = new LinkedList<>();
  27.         list.add("aaaaa");
  28.         list.add("bbbbb");
  29.         list.add("ccccc");
  30.         list.add("ddddd");
  31.         list.add("eeeee");
  32.         list.add("bbbbb");
  33.         list.add("fffff");
  34.         list.addFirst("jj");
  35.         list.addLast("hh");
  36.         list.offer("kk");//添加元素在尾端
  37.         list.offerFirst("pp");
  38.         list.offerLast("rr");
  39.         System.out.println(list);//LinkedList可以添加重复数据
  40.         System.out.println(list.poll());//删除头上的元素并且将元素输出
  41.         System.out.println(list.pollFirst());
  42.         System.out.println(list.pollLast());
  43.         System.out.println(list.removeFirst());
  44.         System.out.println(list.removeLast());
  45.         System.out.println(list);//LinkedList可以添加重复数据
  46.         /*list.clear();//清空集合
  47.         System.out.println(list);*/
  48.         /*System.out.println(list.pollFirst());*/
  49.         /*System.out.println(list.removeFirst());报错:Exception in thread "main" java.util.NoSuchElementException*/
  50.         //集合的遍历:
  51.         System.out.println("---------------------");
  52.         //普通for循环:
  53.         for(int i = 0;i<list.size();i++){
  54.             System.out.println(list.get(i));
  55.         }
  56.         System.out.println("---------------------");
  57.         //增强for:
  58.         for(String s:list){
  59.             System.out.println(s);
  60.         }
  61.         System.out.println("---------------------");
  62.         //迭代器:
  63.         /*Iterator<String> it = list.iterator();
  64.         while(it.hasNext()){
  65.             System.out.println(it.next());
  66.         }*/
  67.         //下面这种方式好,节省内存
  68.         for(Iterator<String> it = list.iterator();it.hasNext();){
  69.             System.out.println(it.next());
  70.         }
  71.     }
  72. }

LinkedList简要底层原理图

模拟LinkedList源码
  1. package com.star.test05;
  2. /**
  3.  * @author : Starshine
  4.  */
  5. public class MyLinkedList {
  6.     //链中一定有一个首节点:
  7.     Node first;
  8.     //链中一定有一个尾节点:
  9.     Node last;
  10.     //计数器:
  11.     int count = 0;
  12.     //提供一个构造器:
  13.     public MyLinkedList(){
  14.     }
  15.     //添加元素方法:
  16.     public void add(Object o){
  17.         if(first == null){//证明你添加的元素是第一个节点:
  18.             //将添加的元素封装为一个Node对象:
  19.             Node n = new Node();
  20.             n.setPre(null);
  21.             n.setObj(o);
  22.             n.setNext(null);
  23.             //当前链中第一个节点变为n
  24.             first = n;
  25.             //当前链中最后一个节点变为n
  26.             last = n;
  27.         }else{//证明已经不是链中第一个节点了
  28.             //将添加的元素封装为一个Node对象:
  29.             Node n = new Node();
  30.             n.setPre(last);//n的上一个节点一定是当前链中的最后一个节点last
  31.             n.setObj(o);
  32.             n.setNext(null);
  33.             //当前链中的最后一个节点的下一个元素 要指向n
  34.             last.setNext(n);
  35.             //将最后一个节点变为n
  36.             last = n;
  37.         }
  38.         //链中元素数量加1
  39.         count++;
  40.     }
  41.     //得到集合中元素的数量:
  42.     public int getSize(){
  43.         return count;
  44.     }
  45.     //通过下标得到元素:
  46.     public Object get(int index){
  47.         //获取链表的头元素:
  48.         Node n = first;
  49.         //一路next得到想要的元素
  50.         for(int i=0;i<index;i++){
  51.             n = n.getNext();
  52.         }
  53.         return n.getObj();
  54.     }
  55. }
  56. class Test{
  57.     //这是main方法,程序的入口
  58.     public static void main(String[] args) {
  59.         //创建一个MyLinkedList集合对象:
  60.         MyLinkedList ml = new MyLinkedList();
  61.         ml.add("aa");
  62.         ml.add("bb");
  63.         ml.add("cc");
  64.         System.out.println(ml.getSize());
  65.         System.out.println(ml.get(0));
  66.     }
  67. }

debug验证数据添加成功:

LinkedList源码解析

【1】JDK1.7和JDK1.8的LinkedList的源码是一致的

【2】源码:

  1. public class LinkedList<E>{//E是一个泛型,具体的类型要在实例化的时候才会最终确定
  2.         transient int size = 0;//集合中元素的数量
  3.         //Node的内部类
  4.         private static class Node<E> {
  5.         E item;//当前元素
  6.         Node<E> next;//指向下一个元素地址
  7.         Node<E> prev;//上一个元素地址
  8.         Node(Node<E> prev, E element, Node<E> next) {
  9.             this.item = element;
  10.             this.next = next;
  11.             this.prev = prev;
  12.         }
  13.     }
  14.         transient Node<E> first;//链表的首节点
  15.         transient Node<E> last;//链表的尾节点
  16.         //空构造器:
  17.         public LinkedList() {
  18.     }
  19.         //添加元素操作:
  20.         public boolean add(E e) {
  21.         linkLast(e);
  22.         return true;
  23.     }
  24.         void linkLast(E e) {//添加的元素e
  25.         final Node<E> l = last;//将链表中的last节点给l 如果是第一个元素的话 l为null
  26.                 //将元素封装为一个Node具体的对象:
  27.         final Node<E> newNode = new Node<>(l, e, null);
  28.                 //将链表的last节点指向新的创建的对象:
  29.         last = newNode;
  30.                
  31.         if (l == null)//如果添加的是第一个节点
  32.             first = newNode;//将链表的first节点指向为新节点
  33.         else//如果添加的不是第一个节点
  34.             l.next = newNode;//将l的下一个指向为新的节点
  35.         size++;//集合中元素数量加1操作
  36.         modCount++;
  37.     }
  38.         //获取集合中元素数量
  39.         public int size() {
  40.         return size;
  41.     }
  42.         //通过索引得到元素:
  43.         public E get(int index) {
  44.         checkElementIndex(index);//健壮性考虑
  45.         return node(index).item;
  46.     }
  47.        
  48.     Node<E> node(int index) {
  49.         //如果index在链表的前半段,那么从前往后找
  50.         if (index < (size >> 1)) {
  51.             Node<E> x = first;
  52.             for (int i = 0; i < index; i++)
  53.                 x = x.next;
  54.             return x;
  55.         } else {//如果index在链表的后半段,那么从后往前找
  56.             Node<E> x = last;
  57.             for (int i = size - 1; i > index; i--)
  58.                 x = x.prev;
  59.             return x;
  60.         }
  61.     }
  62. }
面试题:iterator(),Iterator,Iterable关系

【1】面试题:对应的关系:

【2】hasNext(),next()的具体实现:

【3】增强for循环  底层也是通过迭代器实现的:

ListIterator迭代器

【1】加入字符串:

  1. package com.star.test06;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. /**
  6.  * @author : Starshine
  7.  */
  8. public class Test2 {
  9.     //这是main方法,程序的入口
  10.     public static void main(String[] args) {
  11.         ArrayList<String> list = new ArrayList<>();
  12.         list.add("aa");
  13.         list.add("bb");
  14.         list.add("cc");
  15.         list.add("dd");
  16.         list.add("ee");
  17.         //在"cc"之后添加一个字符串"kk"
  18.         Iterator<String> it = list.iterator();
  19.         while(it.hasNext()){
  20.             if("cc".equals(it.next())){
  21.                 list.add("kk");
  22.             }
  23.         }
  24.     }
  25. }

发现报错:

出错原因:就是迭代器和list同时对集合进行操作:

解决办法:事情让一个“人”做 --》引入新的迭代器:ListIterator

迭代和添加操作都是靠ListIterator来完成的:

  1. package com.star.test06;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.ListIterator;
  6. /**
  7.  * @author : Starshine
  8. */
  9. public class Test2 {
  10.     //这是main方法,程序的入口
  11.     public static void main(String[] args) {
  12.         ArrayList<String> list = new ArrayList<>();
  13.         list.add("aa");
  14.         list.add("bb");
  15.         list.add("cc");
  16.         list.add("dd");
  17.         list.add("ee");
  18.         //在"cc"之后添加一个字符串"kk"
  19.         ListIterator<String> it = list.listIterator();
  20.         while(it.hasNext()){
  21.             if("cc".equals(it.next())){
  22.                 it.add("kk");
  23.             }
  24.         }
  25.         System.out.println(it.hasNext());
  26.         System.out.println(it.hasPrevious());
  27.         //逆向遍历:
  28.         while(it.hasPrevious()){
  29.             System.out.println(it.previous());
  30.         }
  31.         System.out.println(it.hasNext());
  32.         System.out.println(it.hasPrevious());
  33.         System.out.println(list);
  34.     }
  35. }

相关文章:

【Java】LinkedList实现类的使用

LinkedList实现类的使用 package com.star.test04;import java.util.Iterator;import java.util.LinkedList;/** * author : Starshine */public class Test { //这是main方法&#xff0c;程序的入口 public static void main(String[] args) { /* LinkedL…...

创建人物状态栏

接下来&#xff0c;我们来尝试制作一下我们的UI&#xff0c;我们会学习unity基本的UI系统 ************************************************************************************************************** 我们要先安装一个好用的插件到我们的unity当中&#xff0c;帮助…...

django5入门【01】环境配置

注意&#xff1a; ⭐前提&#xff1a;安装了annaconda&#xff08;python版本管理工具&#xff09;&#xff0c;如果没有安装&#xff0c;强烈建议安装一下&#xff01;&#xff01;&#xff01;操作&#xff1a; 前言&#xff1a; 这里新创建一个名为“python_3.11_start_dja…...

1000集《楼兰》系列短剧开机仪式在疆举行,开启全球传播新篇章

2024年10月18日&#xff0c;光明媚&#xff0c;秋风送爽。 在这个收获的季节里&#xff0c;倍受期待的楼兰系列短剧《楼兰之天女归来》和《楼兰之时空秘宝》在新疆吐鲁番东方红卓览文化博物馆举行了隆重的开机仪式&#xff0c;正式拉开了摄制的序幕。 1000集《楼兰》系列短剧…...

【景观生态学实验】实验五 景观生态脆弱性评价

实验目的 1.学习层次分析模型思路&#xff0c;对丹江口库区2000年景观生态脆弱性评价建模&#xff1a;通过实验课的学习&#xff0c;深入理解层次分析&#xff08;Analytic Hierarchy Process&#xff0c;AHP&#xff09;理论与模型&#xff0c;了解其在决策问题中的应用&…...

ChatGPT 现已登陆 Windows 平台

今天&#xff0c;OpenAI 宣布其人工智能聊天机器人平台 ChatGPT 已开始预览专用 Windows 应用程序。OpenAI 表示&#xff0c;该应用目前仅适用于 ChatGPT Plus、Team、Enterprise 和 Edu 用户&#xff0c;是一个早期版本&#xff0c;将在今年晚些时候推出"完整体验"。…...

和鲸社区数据科学实训季,西安交通大学圆满收官,西安,后会有期!

和鲸社区数据科学实训季活动已走进数十家高校&#xff0c;在西安的收官之站&#xff0c;落定西安交通大学管理学院&#xff0c;为本次西安之旅画上了圆满的句号。 和鲸社区 2024秋 数据科学实训季以“帮助同学积累真实场景项目经验”为出发点&#xff0c;提供 60 个数据科学实践…...

工作使用篇:如何在centos系统中安装anaconda

在CentOS 7上安装Anaconda的步骤如下&#xff1a; 1. 下载Anaconda 首先&#xff0c;你需要下载Anaconda的安装脚本。可以使用wget命令从Anaconda的官网获取最新版本的安装脚本。打开终端并运行以下命令&#xff1a; wget https://repo.anaconda.com/archive/Anaconda3-2024…...

qt creator 转 visual stdio 项目调试

因果 大家在使用qt creator调试程序时&#xff0c;会出现未知错误&#xff0c;比如下图&#xff0c;直接release运行就没有问题。由于调试复杂程序&#xff0c;使用qt creator都感觉不如vs&#xff0c;会报未知中断。 所以有了从qt creator转换到 visual stdio来调试的想法。…...

django5入门【02】创建新的django程序

注意&#xff1a; ⭐前提&#xff1a;已经安装了python以及django所依赖的包1、通过django-admin管理工具在命令行创建Django应用程序&#xff0c;创建命令如下&#xff1a; django-admin startproject ProjectName❓ 疑问&#xff1a;除了使用命令行创建django程序外&#x…...

乐趣无限,十个让你沉浸的“摸鱼”网站

在繁忙的生活中&#xff0c;我们总需要一些摸鱼时刻&#xff0c;来为紧绷的神经松绑。无论是工作间隙的小憩&#xff0c;还是下班后的放松&#xff0c;适当的摸鱼不仅能提升效率&#xff0c;还能让生活充满乐趣。今天&#xff0c;我为大家推荐几个绝对能让你乐在其中的网站&…...

ubuntu22.04 桌面系统怎么搭建一个esp-idf的项目,搭建开发环境

详细介绍如何在 Ubuntu 22.04 桌面系统上搭建 ESP-IDF 的开发环境&#xff0c;并创建一个 ESP-IDF 项目。以下内容将涵盖从环境准备到项目创建和编译的所有步骤。 目录 环境准备 1.1 更新系统1.2 安装必要的工具和依赖项 安装 ESP-IDF 2.1 克隆 ESP-IDF 仓库2.2 运行安装脚本 …...

iOS Swift逆向——deMangle过程中的偏移计算

碰到好多函数最开始都会调用这个函数&#xff0c;xref了一下&#xff0c;发现有上万个xref。 __int64 __fastcall sub_1000B6ED0(__int64 *a1) {__int64 result; // x0result *a1;if ( result < 0 ){result swift_getTypeByMangledNameInContext((char *)a1 (int)result…...

国产大模型基础能力大比拼 - 计数:通义千文 vs 文心一言 vs 智谱 vs 讯飞-正经应用场景的 LLM 逻辑测试

在大语言模型&#xff08;LLM&#xff09;不断涌现的时代&#xff0c;如何评估这些国产大模型的逻辑推理能力&#xff0c;尤其是在处理基础计数问题上的表现&#xff0c;成为了一个备受关注的话题。随着越来越多的国产大模型进入市场&#xff0c;比较它们在不同任务中的表现尤为…...

YOLO11改进 | 注意力机制 | 正确的 Self-Attention 与 CNN 融合范式,性能速度全面提升【独家创新】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 卷积和自注意力是两种强大的表征学习技术…...

0基础学java之Day11

二维数组 静态二位数组 理解&#xff1a;二维数组中包含了多个一维数组 声明&#xff1a; 数据类型 变量名;--推荐 数据类型 变量名; //静态初始化1//String[][] names new String[][]{{"小红","小绿","小蓝"},{"小黄","小紫…...

python主流框架Django:ORM框架关联查询与管理器

目录 注意 使用前要调用之前的模型类 F对象 Q对象 聚合函数 排序 关联查询(连表查询) 修改 删除 查询集 QuerySet 注意 使用前要调用之前的模型类 F对象 之前的查询都是对象的属性与常量值比较&#xff0c;两个属性怎么比较呢&#xff1f; 答&#xff1a;使用 "F对象&quo…...

如何有效维护您的WordPress在线商店内容:提高客户参与度与转化率的实用技巧

在电子商务领域&#xff0c;内容为王。新鲜、相关且有吸引力的内容能显著提升客户参与度和转化率。本文将探讨如何有效更新和维护您的在线商店内容&#xff0c;确保客户始终获得最佳体验。 定期更新产品信息 产品描述 产品描述是吸引客户和促成销售的关键。定期检查并更新产…...

【Java】认识异常

1.异常概念与体系结构 1.1异常的概念 在我们日常开发中&#xff0c;代码都是尽可能完善&#xff0c;但是难免会出现一些奇奇怪怪的问题。而这些奇奇怪怪的问题可能很难通过代码去控制&#xff0c;比如格式不对会报错&#xff0c;网络不好也会报错等。 在Java中&#xff0c;将…...

20 Shell Script输入与输出

标出输入、标准输出、错误输出 一、程序的基本三个IO流 一&#xff09;文件描述符 ​ 任何程序在Linux系统中都有3个基本的文件描述符 ​ 比如: ​ cd/proc/$$/fd ​ 进入当前shell程序对于内核在文件系统的映射目录中: [rootlocalhost ~]# cd /proc/$$/fd [rootlocalhos…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...