当前位置: 首页 > 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…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...