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

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...