热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java集合18:LinkedLlist源码图解

 CRUD增删改查 加final是因为一开始已经把last浅拷贝给了l。加入新节点,自然要把其赋值给last,加了final,l指向的就一直是原先的last地址,也就是null,后

 

CRUD增删改查

 

加final是因为一开始已经把last"浅拷贝"给了l。加入新节点,自然要把其赋值给last,加了final,l指向的就一直是原先的last地址,也就是null,后面的赋值不会影响l。

如果不加final,l的地址会随着last修改而修改

first指向这个结点,last指向这个结点,两头为空

final 定义常量,不能修改

 

 

 

 

 

newNode是新定义的指针

newNode的前面指向的是l

内容是e

下一个指向null

然后,last指针重新指向newNode

如果l是空

也就是之前last指针(尾指针)指向的是空

所以,现在头指针是newNode节点

不然,l节点,也就是last指针之前指向的位置的后面一个是newNode节点

这段代码的意思就是把newNode拼接到最后啊

 

final 定义常量,不能修改

Node  :定义一个节点,节点包括三个部分,前指针,内容,后指针

指向的都是这个1

 

 

 

这个意思大概就是   new  Node<>(上一个,本体,下一个);

 

 

 

 删除结点

 

 remove(int index):指定删除的是哪个位置

 remove ():默认删除第一个

 remove (Object o):要对链表里的某一个对象进行比较,然后再删除指定对象

 removeFirst ():删除第一个结点

 

可以用下标删的原因是,他会判断下标节点更靠近头节点还是尾节点,然后遍历一遍(头节点遍历index次,尾节点size-index次),找到要删除的节点

 

 

让f指向这个first,双向链表的第一个结点

不等于空,防止删除的是一个空链表

真正走的是unlinkFirst()

 

 

 真正干活的地方

 

 

f.item 就是把内容取出来,赋给 element

next 指向 f.next

f.item就是内容空了

f.next就是向后的链接没了

first = next :first指向next了

 

 next不等于空的额话就进入else

把next.pre置空

往左的线就断了

 

 

 

package wuyuxin.List_;
import java.util.Iterator;
import java.util.LinkedList;
@SuppressWarnings({"all"})
public class LinkedListCRUD {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
System.out.println("linkedList=" + linkedList);
//删除结点
linkedList.remove();//这里默认删除的是第一个结点
//linkedList.remove(2);
System.out.println("linkedList=" + linkedList);
//修改某个结点
linkedList.set(1,999);
System.out.println("linkedList=" + linkedList);
//得到某个结点对象
//get(1) 是得到双向链表的第二个对象
//源码好想没存索引,就for从0开始遍历到了index-1位置就把Node返回。从index>>2分两部分找,太秒了
Object o = linkedList.get(1);
System.out.println(o);//999
//因为LinkList 是实现了List接口,所以遍历方式
//迭代器遍历
System.out.println("===LinkList遍历迭代器===");
Iterator iterator = linkedList.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println("next=" + next);
}
//快捷键:I(大写的i)
System.out.println("===LinkList遍历增强for===");
for (Object o1 : linkedList) {
System.out.println("o1=" + o1);
}
System.out.println("===LinkList遍历普通for===");
for (int i = 0; i System.out.println(linkedList.get(i));
}
/* 1. LinkedList linkedList = new LinkedList();
public LinkedList() {}
2. 这时 linkedList 的属性 first = null last = null 为空
3. 执行 添加
public boolean add(E e) {
linkLast(e);
return true;
}
4. 将新的结点,加入到双向链表的最后
void linkLast(E e) {
final Node l = last;
final Node newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
*/
/*
linkedList.remove();//这里默认删除的是第一个结点
1. 执行
public E remove() {
return removeFirst();
}
2.执行
真正走的是unlinkFirst()
public E removeFirst() {
final Node f = first;
if (f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
3.执行unlinkFirst, 将 f 指向的双向链表第一个结点拿掉
这里面是关键,真正把双向链表第一个结点拿掉的具体代码
private E unlinkLast(Node l) {
// assert l == last && l != null;
final E element = l.item;
final Node prev = l.prev;
l.item = null;
l.prev = null; // help GC
last = prev;
if (prev == null)
first = null;
else
prev.next = null;
size--;
modCount++;
return element;
}
*/
}
}

 

LinkedList最优使用迭代器遍历,通过节点去遍历,当使用for循环时,get(i)获取某一元素时都需要对整个List重新遍历,迭代器遍历效率最高

 



推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
author-avatar
手机用户2502917943
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有