【Java】LinkedList实现类的使用
LinkedList实现类的使用
- package com.star.test04;
- import java.util.Iterator;
- import java.util.LinkedList;
- /**
- * @author : Starshine
- */
- public class Test {
- //这是main方法,程序的入口
- public static void main(String[] args) {
- /*
- LinkedList常用方法:
- 增加 addFirst(E e) addLast(E e)
- offer(E e) offerFirst(E e) offerLast(E e)
- 删除 poll()
- pollFirst() pollLast() ---》JDK1.6以后新出的方法,提高了代码的健壮性
- removeFirst() removeLast()
- 修改
- 查看 element()
- getFirst() getLast()
- indexOf(Object o) lastIndexOf(Object o)
- peek()
- peekFirst() peekLast()
- 判断
- */
- //创建一个LinkedList集合对象:
- LinkedList<String> list = new LinkedList<>();
- list.add("aaaaa");
- list.add("bbbbb");
- list.add("ccccc");
- list.add("ddddd");
- list.add("eeeee");
- list.add("bbbbb");
- list.add("fffff");
- list.addFirst("jj");
- list.addLast("hh");
- list.offer("kk");//添加元素在尾端
- list.offerFirst("pp");
- list.offerLast("rr");
- System.out.println(list);//LinkedList可以添加重复数据
- System.out.println(list.poll());//删除头上的元素并且将元素输出
- System.out.println(list.pollFirst());
- System.out.println(list.pollLast());
- System.out.println(list.removeFirst());
- System.out.println(list.removeLast());
- System.out.println(list);//LinkedList可以添加重复数据
- /*list.clear();//清空集合
- System.out.println(list);*/
- /*System.out.println(list.pollFirst());*/
- /*System.out.println(list.removeFirst());报错:Exception in thread "main" java.util.NoSuchElementException*/
- //集合的遍历:
- System.out.println("---------------------");
- //普通for循环:
- for(int i = 0;i<list.size();i++){
- System.out.println(list.get(i));
- }
- System.out.println("---------------------");
- //增强for:
- for(String s:list){
- System.out.println(s);
- }
- System.out.println("---------------------");
- //迭代器:
- /*Iterator<String> it = list.iterator();
- while(it.hasNext()){
- System.out.println(it.next());
- }*/
- //下面这种方式好,节省内存
- for(Iterator<String> it = list.iterator();it.hasNext();){
- System.out.println(it.next());
- }
- }
- }
LinkedList简要底层原理图

模拟LinkedList源码
- package com.star.test05;
- /**
- * @author : Starshine
- */
- public class MyLinkedList {
- //链中一定有一个首节点:
- Node first;
- //链中一定有一个尾节点:
- Node last;
- //计数器:
- int count = 0;
- //提供一个构造器:
- public MyLinkedList(){
- }
- //添加元素方法:
- public void add(Object o){
- if(first == null){//证明你添加的元素是第一个节点:
- //将添加的元素封装为一个Node对象:
- Node n = new Node();
- n.setPre(null);
- n.setObj(o);
- n.setNext(null);
- //当前链中第一个节点变为n
- first = n;
- //当前链中最后一个节点变为n
- last = n;
- }else{//证明已经不是链中第一个节点了
- //将添加的元素封装为一个Node对象:
- Node n = new Node();
- n.setPre(last);//n的上一个节点一定是当前链中的最后一个节点last
- n.setObj(o);
- n.setNext(null);
- //当前链中的最后一个节点的下一个元素 要指向n
- last.setNext(n);
- //将最后一个节点变为n
- last = n;
- }
- //链中元素数量加1
- count++;
- }
- //得到集合中元素的数量:
- public int getSize(){
- return count;
- }
- //通过下标得到元素:
- public Object get(int index){
- //获取链表的头元素:
- Node n = first;
- //一路next得到想要的元素
- for(int i=0;i<index;i++){
- n = n.getNext();
- }
- return n.getObj();
- }
- }
- class Test{
- //这是main方法,程序的入口
- public static void main(String[] args) {
- //创建一个MyLinkedList集合对象:
- MyLinkedList ml = new MyLinkedList();
- ml.add("aa");
- ml.add("bb");
- ml.add("cc");
- System.out.println(ml.getSize());
- System.out.println(ml.get(0));
- }
- }
debug验证数据添加成功:

LinkedList源码解析
【1】JDK1.7和JDK1.8的LinkedList的源码是一致的
【2】源码:
- public class LinkedList<E>{//E是一个泛型,具体的类型要在实例化的时候才会最终确定
- transient int size = 0;//集合中元素的数量
- //Node的内部类
- private static class Node<E> {
- E item;//当前元素
- Node<E> next;//指向下一个元素地址
- Node<E> prev;//上一个元素地址
- Node(Node<E> prev, E element, Node<E> next) {
- this.item = element;
- this.next = next;
- this.prev = prev;
- }
- }
- transient Node<E> first;//链表的首节点
- transient Node<E> last;//链表的尾节点
- //空构造器:
- public LinkedList() {
- }
- //添加元素操作:
- public boolean add(E e) {
- linkLast(e);
- return true;
- }
- void linkLast(E e) {//添加的元素e
- final Node<E> l = last;//将链表中的last节点给l 如果是第一个元素的话 l为null
- //将元素封装为一个Node具体的对象:
- final Node<E> newNode = new Node<>(l, e, null);
- //将链表的last节点指向新的创建的对象:
- last = newNode;
- if (l == null)//如果添加的是第一个节点
- first = newNode;//将链表的first节点指向为新节点
- else//如果添加的不是第一个节点
- l.next = newNode;//将l的下一个指向为新的节点
- size++;//集合中元素数量加1操作
- modCount++;
- }
- //获取集合中元素数量
- public int size() {
- return size;
- }
- //通过索引得到元素:
- public E get(int index) {
- checkElementIndex(index);//健壮性考虑
- return node(index).item;
- }
- Node<E> node(int index) {
- //如果index在链表的前半段,那么从前往后找
- if (index < (size >> 1)) {
- Node<E> x = first;
- for (int i = 0; i < index; i++)
- x = x.next;
- return x;
- } else {//如果index在链表的后半段,那么从后往前找
- Node<E> x = last;
- for (int i = size - 1; i > index; i--)
- x = x.prev;
- return x;
- }
- }
- }
面试题:iterator(),Iterator,Iterable关系
【1】面试题:对应的关系:

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

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


ListIterator迭代器
【1】加入字符串:
- package com.star.test06;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- /**
- * @author : Starshine
- */
- public class Test2 {
- //这是main方法,程序的入口
- public static void main(String[] args) {
- ArrayList<String> list = new ArrayList<>();
- list.add("aa");
- list.add("bb");
- list.add("cc");
- list.add("dd");
- list.add("ee");
- //在"cc"之后添加一个字符串"kk"
- Iterator<String> it = list.iterator();
- while(it.hasNext()){
- if("cc".equals(it.next())){
- list.add("kk");
- }
- }
- }
- }
发现报错:

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

解决办法:事情让一个“人”做 --》引入新的迭代器:ListIterator
迭代和添加操作都是靠ListIterator来完成的:
- package com.star.test06;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import java.util.ListIterator;
- /**
- * @author : Starshine
- */
- public class Test2 {
- //这是main方法,程序的入口
- public static void main(String[] args) {
- ArrayList<String> list = new ArrayList<>();
- list.add("aa");
- list.add("bb");
- list.add("cc");
- list.add("dd");
- list.add("ee");
- //在"cc"之后添加一个字符串"kk"
- ListIterator<String> it = list.listIterator();
- while(it.hasNext()){
- if("cc".equals(it.next())){
- it.add("kk");
- }
- }
- System.out.println(it.hasNext());
- System.out.println(it.hasPrevious());
- //逆向遍历:
- while(it.hasPrevious()){
- System.out.println(it.previous());
- }
- System.out.println(it.hasNext());
- System.out.println(it.hasPrevious());
- System.out.println(list);
- }
- }
相关文章:
【Java】LinkedList实现类的使用
LinkedList实现类的使用 package com.star.test04;import java.util.Iterator;import java.util.LinkedList;/** * author : Starshine */public class Test { //这是main方法,程序的入口 public static void main(String[] args) { /* LinkedL…...
创建人物状态栏
接下来,我们来尝试制作一下我们的UI,我们会学习unity基本的UI系统 ************************************************************************************************************** 我们要先安装一个好用的插件到我们的unity当中,帮助…...
django5入门【01】环境配置
注意: ⭐前提:安装了annaconda(python版本管理工具),如果没有安装,强烈建议安装一下!!!操作: 前言: 这里新创建一个名为“python_3.11_start_dja…...
1000集《楼兰》系列短剧开机仪式在疆举行,开启全球传播新篇章
2024年10月18日,光明媚,秋风送爽。 在这个收获的季节里,倍受期待的楼兰系列短剧《楼兰之天女归来》和《楼兰之时空秘宝》在新疆吐鲁番东方红卓览文化博物馆举行了隆重的开机仪式,正式拉开了摄制的序幕。 1000集《楼兰》系列短剧…...
【景观生态学实验】实验五 景观生态脆弱性评价
实验目的 1.学习层次分析模型思路,对丹江口库区2000年景观生态脆弱性评价建模:通过实验课的学习,深入理解层次分析(Analytic Hierarchy Process,AHP)理论与模型,了解其在决策问题中的应用&…...
ChatGPT 现已登陆 Windows 平台
今天,OpenAI 宣布其人工智能聊天机器人平台 ChatGPT 已开始预览专用 Windows 应用程序。OpenAI 表示,该应用目前仅适用于 ChatGPT Plus、Team、Enterprise 和 Edu 用户,是一个早期版本,将在今年晚些时候推出"完整体验"。…...
和鲸社区数据科学实训季,西安交通大学圆满收官,西安,后会有期!
和鲸社区数据科学实训季活动已走进数十家高校,在西安的收官之站,落定西安交通大学管理学院,为本次西安之旅画上了圆满的句号。 和鲸社区 2024秋 数据科学实训季以“帮助同学积累真实场景项目经验”为出发点,提供 60 个数据科学实践…...
工作使用篇:如何在centos系统中安装anaconda
在CentOS 7上安装Anaconda的步骤如下: 1. 下载Anaconda 首先,你需要下载Anaconda的安装脚本。可以使用wget命令从Anaconda的官网获取最新版本的安装脚本。打开终端并运行以下命令: wget https://repo.anaconda.com/archive/Anaconda3-2024…...
qt creator 转 visual stdio 项目调试
因果 大家在使用qt creator调试程序时,会出现未知错误,比如下图,直接release运行就没有问题。由于调试复杂程序,使用qt creator都感觉不如vs,会报未知中断。 所以有了从qt creator转换到 visual stdio来调试的想法。…...
django5入门【02】创建新的django程序
注意: ⭐前提:已经安装了python以及django所依赖的包1、通过django-admin管理工具在命令行创建Django应用程序,创建命令如下: django-admin startproject ProjectName❓ 疑问:除了使用命令行创建django程序外&#x…...
乐趣无限,十个让你沉浸的“摸鱼”网站
在繁忙的生活中,我们总需要一些摸鱼时刻,来为紧绷的神经松绑。无论是工作间隙的小憩,还是下班后的放松,适当的摸鱼不仅能提升效率,还能让生活充满乐趣。今天,我为大家推荐几个绝对能让你乐在其中的网站&…...
ubuntu22.04 桌面系统怎么搭建一个esp-idf的项目,搭建开发环境
详细介绍如何在 Ubuntu 22.04 桌面系统上搭建 ESP-IDF 的开发环境,并创建一个 ESP-IDF 项目。以下内容将涵盖从环境准备到项目创建和编译的所有步骤。 目录 环境准备 1.1 更新系统1.2 安装必要的工具和依赖项 安装 ESP-IDF 2.1 克隆 ESP-IDF 仓库2.2 运行安装脚本 …...
iOS Swift逆向——deMangle过程中的偏移计算
碰到好多函数最开始都会调用这个函数,xref了一下,发现有上万个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 逻辑测试
在大语言模型(LLM)不断涌现的时代,如何评估这些国产大模型的逻辑推理能力,尤其是在处理基础计数问题上的表现,成为了一个备受关注的话题。随着越来越多的国产大模型进入市场,比较它们在不同任务中的表现尤为…...
YOLO11改进 | 注意力机制 | 正确的 Self-Attention 与 CNN 融合范式,性能速度全面提升【独家创新】
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 卷积和自注意力是两种强大的表征学习技术…...
0基础学java之Day11
二维数组 静态二位数组 理解:二维数组中包含了多个一维数组 声明: 数据类型 变量名;--推荐 数据类型 变量名; //静态初始化1//String[][] names new String[][]{{"小红","小绿","小蓝"},{"小黄","小紫…...
python主流框架Django:ORM框架关联查询与管理器
目录 注意 使用前要调用之前的模型类 F对象 Q对象 聚合函数 排序 关联查询(连表查询) 修改 删除 查询集 QuerySet 注意 使用前要调用之前的模型类 F对象 之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用 "F对象&quo…...
如何有效维护您的WordPress在线商店内容:提高客户参与度与转化率的实用技巧
在电子商务领域,内容为王。新鲜、相关且有吸引力的内容能显著提升客户参与度和转化率。本文将探讨如何有效更新和维护您的在线商店内容,确保客户始终获得最佳体验。 定期更新产品信息 产品描述 产品描述是吸引客户和促成销售的关键。定期检查并更新产…...
【Java】认识异常
1.异常概念与体系结构 1.1异常的概念 在我们日常开发中,代码都是尽可能完善,但是难免会出现一些奇奇怪怪的问题。而这些奇奇怪怪的问题可能很难通过代码去控制,比如格式不对会报错,网络不好也会报错等。 在Java中,将…...
20 Shell Script输入与输出
标出输入、标准输出、错误输出 一、程序的基本三个IO流 一)文件描述符 任何程序在Linux系统中都有3个基本的文件描述符 比如: cd/proc/$$/fd 进入当前shell程序对于内核在文件系统的映射目录中: [rootlocalhost ~]# cd /proc/$$/fd [rootlocalhos…...
ClickHouse:大数据领域的实时分析新宠
ClickHouse:大数据领域的实时分析新宠 关键词:ClickHouse、实时分析、列式存储、向量化执行、分布式数据库 摘要:在数据爆炸式增长的今天,企业对“实时看到数据价值”的需求越来越迫切。传统数据库在面对海量数据时,要么查询慢如蜗牛,要么成本高到离谱。而ClickHouse作为…...
实战指南:从零构建PyTorch版Latent Diffusion Models(含DDPM/DDIM/PLMS全流程解析)
1. 环境准备与项目搭建 在开始构建Latent Diffusion Models之前,我们需要准备好开发环境。这里推荐使用Python 3.8和PyTorch 1.12版本。如果你有GPU设备,建议安装CUDA 11.3以上版本以获得更好的训练性能。 首先创建一个conda虚拟环境: conda …...
GetQzonehistory终极指南:三步永久备份你的QQ空间数字记忆
GetQzonehistory终极指南:三步永久备份你的QQ空间数字记忆 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否也曾翻看QQ空间,发现那些承载青春记忆的说说正在…...
STM32 TIM编码器模式实战:如何精准计算步进电机闭环控制的脉冲对应关系?
STM32 TIM编码器模式实战:步进电机闭环控制中的脉冲精确换算 步进电机在工业自动化、3D打印和精密仪器中扮演着关键角色,而闭环控制则是确保其运动精度的核心技术。许多工程师在实现闭环控制时,常常困惑于如何准确建立编码器脉冲与电机控制脉…...
三角函数公式速查手册:从基础到进阶的实用指南
三角函数公式速查手册:从基础到进阶的实用指南 三角函数是数学中最基础也最重要的工具之一,无论是学生应对考试,还是开发者在图形编程、信号处理等领域的实际应用,都离不开这些公式的灵活运用。本文将系统整理从基础定义到高级变换…...
抖音下载器技术深度解析:构建高效无水印视频批量采集系统
抖音下载器技术深度解析:构建高效无水印视频批量采集系统 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…...
Apache Spark 第 11 章:Delta Lake 与 Lakehouse
第十一章深入拆解 Delta Lake 与 Lakehouse 架构,这是现代数据工程的核心组件。从传统数据湖的痛点出发,逐层剖析 Delta Lake 的实现原理。 第一张:为什么需要 Delta Lake。三大痛点和 Delta Lake 的解法一目了然。接下来看最核心的实现机制—…...
input-overlay多语言支持:如何为全球观众轻松定制直播输入显示
input-overlay多语言支持:如何为全球观众轻松定制直播输入显示 【免费下载链接】input-overlay Show keyboard, gamepad and mouse input on stream 项目地址: https://gitcode.com/gh_mirrors/in/input-overlay 想要让全球观众都能轻松理解你的游戏操作吗&a…...
打破游戏边界:Sunshine构建你的无缝云游戏体验
打破游戏边界:Sunshine构建你的无缝云游戏体验 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想象一下这样的场景:你在客厅的智能电视上玩着3A大作&#x…...
告别C盘爆满!手把手教你配置Miniforge,让所有虚拟环境乖乖待在D盘
彻底解放C盘空间:Miniforge虚拟环境全迁移至D盘实战指南 每次打开资源管理器看到C盘飘红的存储条,心跳都会漏半拍——这大概是Windows开发者最熟悉的焦虑场景。特别是当你发现conda创建的虚拟环境正悄无声息吞噬着宝贵的系统盘空间时,那种无…...
