LinkedList

底层操作机制

源码图解0515

  1. 底层维护了一个双向链表,实现了双端队列特点

  2. 维护了两个属性,first,last 分别指向 首节点和尾节点

  3. 每个节点 (Node对象),又维护了prev,next,item

  4. LinkedList元素的添加和删除,不是通过数组完成的,效率相对较高

  5. 线程不安全,没有实现同步

  6. 模拟LinkedList

    java 复制代码
    package chapter;
    
    public class LinkedList {
        public static void main(String[] args) {
            Node a = new Node("jack");
            Node b = new Node("Tom");
            Node c = new Node("Jerry");
            //连接结点
            a.next = b;
            b.next = c;
            c.prev = b;
            b.prev = a;
    
            Node first = a; //双向链表的头结点
            Node last = c; //双向链表的尾结点
    
            //遍历   前到后
            System.out.println("=================================");
            while(true){
                if(first == null){
                    break;
                }
                System.out.println(first);
                first = first.next;
            }
            //遍历   后到前
            System.out.println("=================================");
            while(true){
                if(last == null){
                    break;
                }
                System.out.println(last);
                last = last.prev;
            }
    
            //添加对象
            Node d = new Node("smith");
            d.next =c;
            d.prev = a;
            a.next =d;
            c.prev = d;
    
            //再次遍历
            System.out.println("=================================");
            first = a;
            while(true){
                if(first == null){
                    break;
                }
                System.out.println(first);
                first = first.next;
            }
        }
    }
    
    //定义一个Node类,即定义一个Node节点
    class Node {
        public Object item;   //存放数据的位置
        public Node next;     //后一个结点
        public Node prev;     //上一个结点
    
        public Node(Object item) {
            this.item = item;
        }
    
        @Override
        public String toString() {
            return "Node{" +
                    "item=" + item;
        }
    }

    toString重写next prev 产生问题

方法

add()

remove()

比较

|------------|------|-----------|-------|
| | 底层结构 | 增删的效率 | 改查的效率 |
| ArrayList | 可变数组 | 较低 数组扩容 | 较高 |
| LinkedList | 双向链表 | 较高 通过链表追加 | 较低 |

  1. 改查操作多,ArrayList
  2. 增删操作多,LinkedList
  3. 一般程序中,大多为查询,故采用ArrayList
  4. 也可两个模块分别使用ArrayList LinkedList
相关推荐
子兮曰20 分钟前
AI 浏览器 Agent 的安全困局:当自动化工具可以偷走你的登录态
前端·人工智能·后端
学者猫头鹰24 分钟前
分布式事务实战教程
java·分布式
程序员黑豆26 分钟前
鸿蒙应用开发之@Styles 装饰器:定义可复用的组件样式
前端·harmonyos
程序员码歌28 分钟前
我全程用 AI开发了一款微信小游戏,上线了
android·前端·游戏开发
咩咩啃树皮30 分钟前
第52篇:前端工程化完整体系精讲——Vite构建、模块化、打包原理、规范体系、面试终极通关
前端·面试·职场和发展
妙码生花31 分钟前
从 PHP 到 AI + Golang,程序员自救转型手记(四十八):菜单规则管理实现
前端·后端·ai编程
FogLetter32 分钟前
当JavaScript学会“分身术”:异步编程的进化简史
前端·javascript·面试
hunterandroid1 小时前
[鸿蒙从零到一] HarmonyOS 分布式能力与设备协同实战:从发现设备到任务闭环
前端
lichenyang4531 小时前
从图片创作到本地可复现的 AIGC 全栈闭环:AIGC Creative Studio 实践复盘
前端·后端
牧艺1 小时前
别急着 Vibe Coding:AI 三小时写完需求后,我为什么宁愿多花一天
前端·agent·vibecoding