Java进阶:【集合】linkedlist的原理,手写linkedlist,源码阅读

源码阅读(7):Java中主要的List、Deque结构——LinkedList集合(中) 典型的数据结构中,对于“表”结构的定义是:在一维空间下元素按照某种逻辑结构进行线性连接排列的数据结构(一对一)。java中集合定义中所包括的链表(ArrayList)、链表(LinkedList)、各种队列(Queue/Deque)、栈(Stack)等都满足这样的定义。本文及后续的几篇文章中将介绍Java集合结构中关于List接口、Queue接口、Set接口下的重要实现类。注意,关于java.util.concurrent包下对于List接口、Queue接口和Set接口实现类的介绍,将在后续专门的文章介绍 阅读详情

linkedlist

LinkedList 常用方法:

  • 增加:addFirst(E e),addLast(E e),offer(E e),offerFirst(E e),offerLast(E e)
  • 删除:poll(),pollFirst(),pollLast(),removeFirst(),removeLast()
  • 修改:set(int index, E element)
  • 查看:element(),getFirst(),getLast(),indexOf(Object o),lastIndexOf(Object o),peek(),peekFirst(),peekLast()
  • 判断:

示例代码:

//    现有一个linkedlist集合对象
        public static void main(String[] args) {
            LinkedList<String> list = new LinkedList();
//          能否重复添加数据
            list.add("aaaa");
            list.add("bbbb");
            list.add("aaaa");
            list.add("cccc");
            System.out.println(list);
//            收尾添加
            list.addFirst("ffff");
            list.addLast("zzzz");
            System.out.println(list);
//            添加元素到尾端
            list.offer("ll");
            System.out.println(list);

            list.offerFirst("pp");
            list.offerLast("rr");
//            删除首个元素
            System.out.println(list);
            System.out.println("删除"+list.poll());//删除头上的元素,并且返回删除的元素
            System.out.println("删除"+list.pollFirst());
            System.out.println("删除"+list.pollLast());
            System.out.println(list);
//查找头尾元素
            System.out.println(list.peek());
            System.out.println(list.peekLast());
//            list.clear();

//           方法的举例
            System.out.println(list);
            System.out.println(list.pollLast());//如果没有返回null,不影响程序执行
            System.out.println(list.removeFirst());//Exception in thread "main" java.util.NoSuchElementException,会报错,

//            遍历
            System.out.println("----------");
//            1
            for (int i=0; i<list.size();i++){
                System.out.println(list.get(i));
            }
//            2
            for (String s : list) {
                System.out.println(s);
            }
//            3
            Iterator it = list.iterator();
            while (it.hasNext()){
                System.out.println(it.next());
            }
//            可能源码看到,这个迭代器相对好,内存上的节省
            for ( Iterator it1 = list.iterator();it1.hasNext();){
                System.out.println(it1.next());
            }

为什么有功能相同的方法:以

pollFirst(),pollLast(),

removeFirst(),removeLast()

为例:

removeFirst是早版本的

pollFirst是jdk1.6版本的

实测区别:

//           方法的举例
            System.out.println(list);
            System.out.println(list.pollLast());//如果没有返回null,不影响程序执行
            System.out.println(list.removeFirst());//Exception in thread "main" java.util.NoSuchElementException,会报错,

同样是空的集合,pollFirst删除第一个如果没有返回null,无报错,removeFirst会报错没有数据

相比之下1.6之后的方法提高了健壮性,其他类似方法与这一对一致,

遍历方式:

源码看到,这个迭代器相对好,内存上的节省,例子:

for ( Iterator it1 = list.iterator();it1.hasNext();){
                System.out.println(it1.next());
            }

linkedlist的原理

对比学习:

Arraylist数据结构:Linledlist数据结构:
物理结构:紧密结构物理结构:跳转结构
逻辑结构:线性表(数组)逻辑结构:线性表(链表)
Linkedlist是双向链表:

简要底层原理图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BSCCx2Gt-1637923945278)(javaSE.assets/image-20210703093116848.png)]

模拟一个linkedList

首先是我们的节点类

package linkedListPrc;

import javax.xml.soap.Node;

public class Test02 {//节点类
//    三个属性
//    上一个元素的地址
private Test02 pre;
//    当前存放的元素
private Object obj;
//    下一个元素的地址
private Test02 next;

    public Test02 getPre() {
        return pre;
    }

    public void setPre(Test02 pre) {
        this.pre = pre;
    }

    public Object getObj() {
        return obj;
    }

    public void setObj(Object obj) {
        this.obj = obj;
    }

    public Test02 getNext() {
        return next;
    }

    public void setNext(Test02 next) {
        this.next = next;
    }

    public Test02() {
    }
}

之后就是我们的mylist源码

public class MyLinkedList {
//   链中一个定有一个首节点
Test02 first;
//    链中一个有一个尾节点
Test02 last;
//    计数器
    int count =0;
//    提供一个构造器
    public  MyLinkedList(){

    }
//    元素添加方法
    public void add(Object o){
        if (first ==null){//证明添加的元素是第一个
//            那接下来我们需要吧添加的元素封装成一个node
            Test02 n = new Test02();
            n.setPre(null);
            n.setObj(o);
            n.setNext(null);
            first = n;
            last = n;
        }else {//证明以及不是链中的第一个节点了
//            先把添加的元素封装成一个node对象
            Test02 n = new Test02();
            n.setPre(last);
            n.setObj(o);
//            当前链中的最后一个节点的下一个元素要指向n
            last.setNext(n);
//            将最后一个节点变成n
            last = n;
        }
        count++;
    }
    public int getSize(){
        return count;
    }
//    通过下标得到元素
    public  Object getelByindex(int index){
        if (index>count){
            System.out.println("这个索引上没有数据,检查插入的元素是否达到查找索引的数量");
        }
//        获取链表的头元素
        Test02 n = first;
        for (int i = 0;i< index;i++){
//          一路next找到想要的元素
                n = n.getNext();
        }
          return n.getObj();
    }
}

linkdelist部分源码解读

public class LinkedList<E>{
     //长度
   transient int size = 0;

     //首位
    transient Node<E> first;

     //尾位
    transient Node<E> last;
    
     //封装节点对象方法
        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 addAll(Collection<? extends E> c) {
        return addAll(size, c);
    }
   
      void linkLast(E e) { //添加的元素e
        final Node<E> l = last;
           //将链表中的last节点给l,如果是第一个元素的话l为null
        final Node<E> newNode = new Node<>(l, e, null);
          //将元素封装为一个node的具体对象
        last = newNode;
           //将链表的为节点指向新创建的对象
        if (l == null)如果添加的是第一个节点
            first = newNode;//将链表的first节点只想为新节点
        else //如果添加的不是第一个节点
            l.next = newNode;//将l的下一个指向新的节点
        size++; //集合中元素数量加1
        modCount++;
    }
    
    //查找方法
        public E get(int index) {
        checkElementIndex(index);
        return node(index).item;
    }
    
    //二分查找的方式遍历链表
        Node<E> node(int index) {

        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }
    
}

NVIDIA DRIVE SDK深度解析(一)——核心组件与安全架构设计 本文深度解析NVIDIA DRIVE SDK的核心组件与安全架构设计,涵盖DriveOS、加速库和应用框架三层架构,以及虚拟化与安全隔离机制。重点探讨了安全岛设计、媒体处理流水线和功能安全监控体系,为开发者提供自动驾驶系统开发的实战建议和性能优化技巧。 阅读详情

相关推荐

关于笔记本测试的面试准备 2021-10-11

** 关于笔记本测试的面试准备 ** 一、根据JD分析,工作内容以软测为主,硬件知识需要了解一点。 以下几个问题为主要: 1.了解VGA、audio、wlan、bt、TP 、camera等driver,BIOS和image测试。 2.了解性能测试工具?压力测试相关设置? 3.了解preload流程? 二、解决 VGA: video graphics array ——笔记本上外接显示器的接口。 【VGA接口兼容性更强,但是不支持高分辨率。 支持高分辨率:HDMI、DIV、TP】 bt【Bluetooth

xw_009的博客 1867

java 语言之手写 LinkedList 底层源码~

4)是基于链表实现的,因此插入删除效率高(但是如果使用时根据下标来删除,效率还是低),查找效率低。6)还实现了栈和队列的操作方法,因此也可以作为栈、队列和双端队列来使用。5)是基于链表实现的,因此不存在容量不足的问题,所有没有扩容的方法。3)里面的元素允许为null,允许重复。1)是双向链表实现的List。

m0_70985211的博客 341

RK3568 Android12预置APK的三种模式详解:不可卸载、可卸载与永久删除

本文深入解析RK3568 Android12系统中APK预置的三种模式:不可卸载、可卸载与永久删除,详细介绍了每种模式的技术实现、应用场景及实战案例。针对Rockchip平台特性,提供从目录创建到系统编译的完整指南,帮助开发者根据产品需求选择最佳预置方案,并解决常见问题。

k8s6orchestrator的博客 967

Java手写LinkedList和拓展

Node类用于表示链表中的节点,包含数据元素data、指向前一个节点的引用prev和指向后一个节点的引用next。构造函数用于初始化节点的数据元素。通过手写LinkedList的实现,我们深入理解了链表的数据结构和原理,并且加深了对Java语言的熟悉程度。我们学习了如何创建链表、添加元素、获取元素、删除元素和获取链表长度的基本功能。通过实践,我们对链表的操作和链表节点的关系有了更深入的理解。通过拓展部分的代码,我们实现了链表的反转、查找环和合并有序链表等功能。

qq_22593423的博客 191

手把手教你用fusb302实现PD快充:从驱动移植到实战调试(附源码)

本文详细解析了基于FUSB302芯片实现USB PD快充的完整开发流程。内容涵盖芯片选型、硬件设计要点、Linux驱动移植与内核集成,并重点剖析了PD协议交互中的关键调试技巧,如“死亡15ms”时序问题与中断模式选择。文章通过实战经验,帮助嵌入式开发者高效完成从驱动移植到系统集成的全链路开发,并附有源码参考。

sky77的博客 377

别只聊天了!手把手教你为Ollama+Open WebUI搭建本地知识库(基于BGE-M3和Qwen)

本文详细介绍了如何利用Ollama、Open WebUI和BGE-M3构建本地知识库,实现智能问答和文档检索。通过环境准备、文档处理、向量化实战和应用案例,帮助用户突破基础聊天场景,打造高效的个人知识管理体系。特别适合技术文档管理和学术研究场景。

weixin_42523720的博客 479

Java-手写LinkedList集合

1.linkedlist数据结构 1.1单项链表 private static class Node<E> { E item; Node<E> next; Node(E element, Node<E> next) { this.item = element; this.next = next; } } 1.2双...

谢文峰的博客 442

【大二组培训】2017年电子设计大赛H题总结(软件部分)

文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt im

HAIBARA的博客 3023

利用Java手写LinkedList

利用Java手写LinkedList 和ArrayList不同的是,LinkedList是采用链表实现的,链表的特点就是每个节点存储的是value和下个节点的地址,所以不存在类似ArrayList的扩容问题,添加节点只需要一个新的节点对象然后链表末尾指向它就可以了。参考Java官方的LinkedList实现:java.util.LinkedList。不过Java官方使用双向链表实现。 链表和节点 链表有n多个链表节点组成,每个节点存储的都是元素+下个节点的内存地址。如何得到节点中存储的元素实际上是通过从链

weixin_45747080的博客 356

SMPLify-X关键点映射与OpenPose格式转换实战

本文深入解析了SMPLify-X与OpenPose之间关键点映射与格式转换的实战方法。针对SMPL、SMPL-H、SMPLX等参数化人体模型与OpenPose 2D姿态估计标准之间的数据鸿沟,文章详细对比了双方的关键点定义差异,并提供了核心的Python转换代码与映射表构建思路。通过清晰的步骤讲解与调试技巧,帮助开发者实现3D关节数据到OpenPose标准格式的高效、准确转换,为动作捕捉、3D姿态估计等应用奠定数据基础。

weixin_29046035的博客 166

贝叶斯机器学习在吸附量预测中的应用

本文介绍了贝叶斯机器学习在吸附量预测中的应用。通过Python实现完整的贝叶斯建模流程,包括数据生成、预处理、模型构建与评估。文章对比了贝叶斯与频率学派的差异,详细阐述了贝叶斯线性回归和神经网络的实现方法,并提供了数据可视化、模型诊断等技术细节。该方法不仅能预测吸附量,还能量化预测不确定性,为工程决策提供更全面的依据。全文超过6000字,结合理论推导与代码实践,是应用贝叶斯方法解决实际工程问题的完整指南。

AI的内部世界的博客 167

Java小白翻身-手写LinkedList

我们的第一个小目标,是做一个链表结构。其实就是之前写的TuziLinkedList,只不过我们不仅仅要存储Customer,还要存储任意的其他对象。 1、复习 2、单向链表 3、什么是继承? 4、为什么要放Object? 首先,我们复习一下之前写的链表结构: 源代码如下: package tool; import entity.Customer; import tool.CustNode; import java.util.Collection; import java.util.Iterator;

java小白翻身 426

YOLOv11架构革新:华为VanillaNet与BiFPN深度融合的突破性改进实战指南

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有!

LXY_LOVE36的博客 136

Java集合,LinkedList底层实现和原理

概述 文章的内容基于JDK1.7进行分析,之所以选用这个版本,是因为1.8的有些类做了改动,增加了阅读的难度,虽然是1.7,但是对于1.8做了重大改动的内容,文章也会进行说明。 LinkedList类是List接口的实现类,它是一个集合,可以根据索引来随机的访问集合中的元素,还实现了Deque接口,它还是一个队列,可以被当成双端队列来使用。虽然LinkedList是一个List集合,但是它的实...

zhuzj12345的博客 6506

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【初探Java之路 六 】集合1-ArrayList和LinkedList的使用与源码分析

ArrayList是Java集合框架中的一个动态数组实现。它就像一个会自动扩展的魔法背包,当你往里面塞更多东西时,它会自动变大。//学号//姓名//年龄//居住地return sid;return age;/*1:用输出语句完成主界面的编写2:用Scanner实现键盘录入数据3:用switch语句完成操作的选择4:用循环完成再次回到主界面*///创建集合对象,用于保存学生数据信息//用循环完成再次回到主界面//用输出语句完成主界面的编写。

z17711802963的博客 1692

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【Java源码阅读】Java1.8 集合源码

集合,在java中一般指单列集合和双列集合首先上图,类之间的引用图容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合(单列),而 Map 存储着键值对(两个对象)的映射表(双列)。其中。

qq_40248814的博客 998

【Java集合源码解析】LinkedList

通过阅读源码 熟悉API-LinkedList-基于jdk1.8 描述 基于内部类Node实现 增加 public void addFirst(E e){ //只将原来的first的前一个连接到新节点 //没有将新节点的后一个连接原节点 final Node<E> f = first; f.prev = newNode; } public void ...

一键一键敲代码 207

集合源码阅读:LinkedList

# LinkedList -- 增删快。 # 1.继承关系: ``` java public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Seriali...

愿我如星君如月 ... 夜夜流光相皎洁 ... 367

LinkedList源码阅读

打算从这篇文章开始读jdk源码,先从比较简单的LinkedList开始吧。 1.继承关系 先来看一下LinkedList的继承情况,可以看出来,LinkedList继承的是AbstractSequentialList public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io..

haohulala的博客 2407

鬼知道我看了几遍!Java常用集合类总结:ArrayList+LinkedList+Vector+HashMap+Set类+Queue/Deque类集合

JDK提供了大量优秀的集合实现供开发者使用,合格的程序员必须要能够通过功能场景和性能需求选用最合适的集合,这就要求开发者必须熟悉Java的常用集合类。本文将就JavaCollectionsFramework中常用的集合及其特点、适用场景、实现原理进行介绍,供学习者参考。当然,要真正深入理解Java的集合实现,还是要推荐去阅读JDK的源码。 点个小赞,好运不断,来个关注,青春常驻,打个小赏,工资疯涨。。。 Java提供的众多集合类由两大接口衍生而来:Collection接口和Map接口 Collecti.

banzhuanhu的博客 4089

JDK源码阅读顺序

很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起。以下为小编整理的通常所需阅读的源码范围。 标题为包名,后面序号为优先级1-4,优先级递减 1、java.lang 1) Object 1 2) String 1 3) AbstractStringBuilder 1 4) StringBuffer 1 5) StringBuilder 1 6) Boolean 2 7) B...

猴子哥哥的博客 6万+

十三:集合

跳转到总目录 文章目录01、Java 集合框架概述1.1、集合框架与数组的对比及概述1.2、集合框架涉及到的API02、Collection接口方法2.2、Collection接口中的常用方法12.3、Collection接口中的常用方法22.4、Collection接口中的常用方法32.5、Collection接口中的常用方法403、Iterator迭代器接口3.1、使用Iterator遍历Collection3.2、迭代器Iterator的执行原理3.3、Iterator遍历集合的两种错误写法3.4、I

本人主攻Java,希望自己能成为出色的程序员。 4万+

集合的get方法中参数从多少开始_Java集合 LinkedList的原理及使用详解_java

这篇文章主要介绍了Java集合 LinkedList的原理及使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧LinkedList和ArrayList一样是集合List的实现类,虽然较之ArrayList,其使用场景并不多,但同样有用到的时候,那么接下来,我们来认识一下它。一. 定义一个LinkedList public...

weixin_39603573的博客 555

JDK源码阅读篇——持续更新

默认扩容为旧容量的 1.5 倍;若 1.5 倍仍不够,直接用所需最小容量;若超过最大限制,用或抛出 OOM;最后通过数组拷贝完成扩容。LinkedList 通过Node的prevnext指针实现双向链表,通过firstlast指针快速定位头尾,实现高效增删。增删快:仅修改指针,无需移动元素(已知节点时 O(1))。查询慢:无下标,需遍历节点(O(n))。要不要我帮你整理一份JDK 核心类源码阅读重点笔记?笔记会提炼每个类的核心逻辑、关键方法和面试高频考点,方便你快速复习和查阅。

weixin_44840369的博客 1991

LinkedList 源码分析

在 Java 中,(迭代器)是一个用于遍历集合元素的接口。它提供了一种统一的方式来访问集合中的元素,而不需要了解集合的内部实现细节。一、主要方法 :返回下一个元素。 示例: :移除当前由方法返回的元素。这个方法只能在调用方法之后调用一次。 示例: 二、使用场景三、与增强 for 循环的比较增强 for 循环(也称为“foreach”循环)在语法上更加简洁,但它不能像那样在遍历过程中删除元素。增强 for 循环示例: 四、

Wzideng@qq.com 1301

Java集合---LinkedList底层原理

java中的LinkedList类实现了List接口和Deque接口,是一种链表类型的数据结构,支持高效的插入和删除操作,同时也实现了Deque接口,使得LinkedList类也具有队列的特性。LinkedList类的底层实现的数据结构是一个双端的链表。 LinkedList类中有一个内部私有类Node,这个类就代表双端链表的节点Node。这个类有三个属性,分别是前驱节点,本节点的值,后继结点。源...

留下你的观点 780

全网阅读过20k的Java集合框架常见面试题总结!

本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star!【Java学习 面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。欢迎 Star!)。 文末有我的公众号,公众号里有我最新整理的Java学习资料,免费分享。 这么好的文章,一定好先赞后看!!!建议养成这个好习惯!!爱你们!???? 剖析面试最常见问题之Java集合框架 当了...

JavaGuide 6553
上一篇: Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
下一篇: Java进阶:【集合】迭代器原理
冷环渊
博客等级 码龄7年 1130粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷环渊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值