写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对java.util.LinkedList<E>的5个修改操作进行介绍,主要内容包括:

1、LinkedList常用5个修改操作介绍

参考内容:

1、JDK源码(1.7)

--------------------------------------------------------------------

1、LinkedList常用5个修改操作介绍

(1)boolean add(E e)

功能: 将指定元素插入此双端队列的尾部

示例代码:

 import java.util.LinkedList;

 public class LinkedListDemo {
public static void main(String[] args) {
/*********测试LinkedList的'boolean add()'方法的使用**********/ //创建一个LinkedList对象
LinkedList<Student> linkedList = new LinkedList<Student>(); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu1 = new Student(1,"zhangsan",20);
linkedList.add(stu1);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu2 = new Student(2,"lisi",21);
linkedList.add(stu2);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu3 = new Student(3,"wangwu",22);
linkedList.add(stu3);
System.out.println(linkedList);
}
} 运行结果:
[Student [stuId=1, stuName=zhangsan, stuAge=20]]
[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21]]
[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]

源代码如下:

     /*
将指定元素插入此双端队列的尾部
*/
public boolean add(E e) {
//调用内部方法
linkLast(e);
return true;
} /*
将元素e链接到此双端队列的尾部
*/
void linkLast(E e) {
//引用l指向此双端队列对象的尾节点
final Node<E> l = last;
//新建一个Node节点
final Node<E> newNode = new Node<>(l, e, null);
//设置此双端队列对象的last属性指向刚新建的Node节点
last = newNode;
//如果此双端队列中没有节点存在,则设置此双端队列对象的first属性也指向刚新建的Node节点,否则原来的尾节点的next属性指向刚新建的Node节点
if (l == null)
first = newNode;
else
l.next = newNode;
//双端队列中节点个数加1
size++;
//fast-fail机制加1
modCount++;
}

(2)boolean remove(Object o)

功能: 移除此双端队列中的元素o

示例代码:

 import java.util.LinkedList;

 public class LinkedListDemo {
public static void main(String[] args) {
/*********测试LinkedList的'boolean remove(Object o)'方法的使用**********/ //创建一个LinkedList对象
LinkedList<Student> linkedList = new LinkedList<Student>(); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu1 = new Student(1,"zhangsan",20);
linkedList.add(stu1);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu2 = new Student(2,"lisi",21);
linkedList.add(stu2);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu3 = new Student(3,"wangwu",22);
linkedList.add(stu3);
System.out.println(linkedList); System.out.println("linkedList.remove(stu2) : "+linkedList.remove(stu2));
System.out.println(linkedList); System.out.println("linkedList.remove(null) : "+linkedList.remove(null));
System.out.println(linkedList);
}
} 运行结果:
[Student [stuId=1, stuName=zhangsan, stuAge=20]]
[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21]]
[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
linkedList.remove(stu2) : true
[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=3, stuName=wangwu, stuAge=22]]
linkedList.remove(null) : false
[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=3, stuName=wangwu, stuAge=22]]

源代码如下:

     /*
从双端队列中移除对象o
*/
public boolean remove(Object o) {
if (o == null) {
//对象o为null时
//利用for循环双端队列,查询值为null的节点,
for (Node<E> x = first; x != null; x = x.next) {
//找到值为null的节点,调用内部方法unlink()进行删除
if (x.item == null) {
unlink(x);
return true;
}
}
} else {
//对象o不为null时
//利用for循环双端队列,查询值与o对象的值相等的节点
for (Node<E> x = first; x != null; x = x.next) {
//找到值与o对象的值相等的节点,调用内部方法unlink()进行删除
if (o.equals(x.item)) {
unlink(x);
return true;
}
}
}
return false;
} /*
删除双端队列中 节点x
*/
E unlink(Node<E> x) {
// assert x != null;
//记录x节点的值
final E element = x.item;
//记录x节点的下一个节点
final Node<E> next = x.next;
//记录x节点的上一个节点
final Node<E> prev = x.prev; if (prev == null) {
//如果x节点没有上一个节点,则赋值双端队列对象的first属性为next
first = next;
} else {
//如果x节点有上一个节点,则赋值x节点的上一个节点的next属性为next
prev.next = next;
x.prev = null;
} if (next == null) {
//如果x节点没有下一个节点,则赋值双端队列对象的last属性为prev
last = prev;
} else {
//如果x节点有下一个节点,则赋值x节点的下一个节点的prev属性为prev
next.prev = prev;
x.next = null;
} //设置被删除节点的值为null,方便GC
x.item = null;
//双端队列中元素个数减1
size--;
//fast-fail机制标识加1
modCount++;
return element;
}

(3)boolean addAll(Collection<? extends E> c)

功能:  将子集合c中的全部插入到此双端队列的尾部

示例代码:

源代码如下:

     public boolean addAll(Collection<? extends E> c) {
//调用方法addAll(size, c)
return addAll(size, c);
}

(4)boolean addAll(int index, Collection<? extends E> c)

功能: 将子集合c中的全部插入到此双端队列的index开始位置

示例代码:

 import java.util.LinkedList;

 public class LinkedListDemo {
public static void main(String[] args) {
/*********测试LinkedList的'boolean addAll(int index, Collection<? extends E> c)'方法的使用**********/ //创建一个LinkedList对象
LinkedList<Student> linkedList = new LinkedList<Student>(); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu1 = new Student(1,"zhangsan",20);
linkedList.add(stu1); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu2 = new Student(2,"lisi",21);
linkedList.add(stu2); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu3 = new Student(3,"wangwu",22);
linkedList.add(stu3);
System.out.println("linkedList:" + linkedList); //创建一个LinkedList对象
LinkedList<Student> linkedList1 = new LinkedList<Student>(); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu10 = new Student(10,"zhangsan1",20);
linkedList1.add(stu10); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu20 = new Student(20,"lisi2",21);
linkedList1.add(stu20); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu30 = new Student(30,"wangwu3",22);
linkedList1.add(stu30);
System.out.println("linkedList1:" + linkedList1); System.out.println("linkedList1.addAll(2, linkedList) =" + linkedList1.addAll(2, linkedList));
System.out.println("linkedList1:" + linkedList1);
}
} 运行结果:
linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
linkedList1:[Student [stuId=10, stuName=zhangsan1, stuAge=20], Student [stuId=20, stuName=lisi2, stuAge=21], Student [stuId=30, stuName=wangwu3, stuAge=22]]
linkedList1.addAll(2, linkedList) =true
linkedList1:[Student [stuId=10, stuName=zhangsan1, stuAge=20], Student [stuId=20, stuName=lisi2, stuAge=21], Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22], Student [stuId=30, stuName=wangwu3, stuAge=22]]

源代码如下:

     /*
将子集合c中的全部元素插入到此双端队列的index开始的位置
*/
public boolean addAll(int index, Collection<? extends E> c) {
//检查插入位置index是否合法
checkPositionIndex(index); //将待插入的子集合转换成Object数组
Object[] a = c.toArray();
//记录待插入子集合中元素的个数
int numNew = a.length;
//如果待插入子集合中元素的个数为0,则直接返回
if (numNew == 0)
return false; //引用pred指向待插入位置的前一个节点
//引用succ指向待插入位置的节点
Node<E> pred, succ;
if (index == size) {
//将子集合插入在双端队列的尾部
succ = null;
pred = last;
} else {
//不是将子集合插入在双端队列的尾部
//引用succ记录双端队列中index位置上的节点
succ = node(index);
//引用pred记录双端队列中index位置上的前节点
pred = succ.prev;
} //利用for循环依次将子集合中的元素插入到此双端队列中
for (Object o : a) {
//新建一个Node节点
@SuppressWarnings("unchecked") E e = (E) o;
Node<E> newNode = new Node<>(pred, e, null);
if (pred == null)
first = newNode;
else
pred.next = newNode;
pred = newNode;
} //重新链接节点
if (succ == null) {
last = pred;
} else {
pred.next = succ;
succ.prev = pred;
} //双端队列中元素个数加上numNew
size += numNew;
//fast-fail机制加1
modCount++;
return true;
}

(5)void clear()

功能: 将此双端队列中的元素节点全部清空

示例代码:

 import java.util.LinkedList;

 public class LinkedListDemo {
public static void main(String[] args) {
/*********测试LinkedList的'void clear()'方法的使用**********/ //创建一个LinkedList对象
LinkedList<Student> linkedList = new LinkedList<Student>(); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu1 = new Student(1,"zhangsan",20);
linkedList.add(stu1); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu2 = new Student(2,"lisi",21);
linkedList.add(stu2); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu3 = new Student(3,"wangwu",22);
linkedList.add(stu3);
System.out.println("linkedList:" + linkedList); linkedList.clear();
System.out.println("linkedList:" + linkedList);
}
} 运行结果:
linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
linkedList:[]

源代码如下:

     /*
将此双端队列中的元素节点全部清空
*/
public void clear() {
//利用for循环从双端队列的头到尾,依次清空
for (Node<E> x = first; x != null; ) {
Node<E> next = x.next;
x.item = null;
x.next = null;
x.prev = null;
x = next;
}
//将双端队列对象的first、last属性设置为null
first = last = null;
//将双端队列对象的size设置为0
size = 0;
//fast-fail机制加1
modCount++;
}

--------------------------------------------------------------------

java.util.LinkedList<E>系列文章

java.util.LinkedList<E>(1)  java.util.LinkedList<E>(2)  java.util.LinkedList<E>(3)

java.util.LinkedList<E>(4)  java.util.LinkedList<E>(5)  java.util.LinkedList<E>(6)

java.util.LinkedList<E>(7)  java.util.LinkedList<E>(8) 

--------------------------------------------------------------------

相关知识

java.util.Collection<E>   java.util.AbstractCollection<E>   java.util.List<E>

java.util.AbstractList<E>   java.util.Iterator<E>   java.util.ListIterator<E>

Java中的标记接口   迭代器模式   Java中的深拷贝和浅拷贝  java.util.Arrays

java.util.Queue<E>  java.util.Deque<E>

内功心法 -- java.util.LinkedList<E> (3)的更多相关文章

  1. 内功心法 -- java.util.LinkedList<E> (4)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  2. 内功心法 -- java.util.LinkedList<E> (5)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  3. 内功心法 -- java.util.LinkedList<E> (6)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  4. 内功心法 -- java.util.LinkedList<E> (7)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  5. 内功心法 -- java.util.LinkedList<E> (8)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  6. 内功心法 -- java.util.LinkedList<E> (1)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  7. 内功心法 -- java.util.LinkedList<E> (2)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  8. java.util.ArrayList、java.util.vector和java.util.LinkedList (JDK 1.8.0_111)

    一.java.util.ArrayList 1.1 ArrayList 继承结构 ArrayList实现了RandomAccess,可以随机访问(其实就是通过数组下标访问):实现了Cloneable, ...

  9. JDK1.8源码(六)——java.util.LinkedList 类

    上一篇博客我们介绍了List集合的一种典型实现 ArrayList,我们知道 ArrayList 是由数组构成的,本篇博客我们介绍 List 集合的另一种典型实现 LinkedList,这是一个有链表 ...

随机推荐

  1. UML相关说明

    在java开发中,有很多时候我们是在不断的处理类与类之间关系,其中这六种关系是:依赖.关联.聚合.组合.继承.实现. 它们的强弱关系是没有异议的:依赖 < 关联 < 聚合 < 组合& ...

  2. 9 - Python函数定义-位置参数-返回值

    目录 1 函数介绍 1.1 为什么要使用函数 1.2 Python中的函数 2 函数的基本使用 3 函数的参数 3.1 参数的默认值 3.2 可变参数 3.2.1 可变位置传参 3.2.2 可变关键字 ...

  3. python使用unittest模块selenium访问斗鱼获取直播信息

    import unittest from selenium import webdriver from bs4 import BeautifulSoup as bs class douyu(unitt ...

  4. sicily 1193. Up the Stairs

    Time Limit: 1sec    Memory Limit:32MB  Description John is moving to the penthouse of a tall sky-scr ...

  5. 在rhel7上搭建centos7的yum源

    1. 再查看现在主机上的yum源,并将它们删除 [root@localhost ~]# rpm -qa|grep yum | xargs rpm -e --nodeps # --nodeps 不管有没 ...

  6. 在ubuntu 上安装sublime

    1.在sublime官网上下载sublime 2.将下载包解压到指定位置(自己决定) 3.进入解压文件里面 4.鼠标选中sublime_text,点击右键运行. 5.锁在启动器.

  7. 出现ERROR: While executing gem ... (Gem::FilePermissionError)这种错误的解决办法

    重新安装ruby即可解决 brew install ruby

  8. 使用ExtJS做一个用户的增删改查

    extjs版本为4.2,用户数据放在静态list中存储 User.java package com.ext.demo.dao; public class User { private int id; ...

  9. CRM 业务

    1. 创建CRM项目 引入插件 创建数据库 from django.db import models from django.db import models class Department(mod ...

  10. intellij idea 远程tomcat 调试

    由于在服务器上远程调试风险较高,所以万不得已的情况下 不要这样做.可以本地调试好  再上传到服务器上. 1.关闭防火墙 启动Firewalld,及开机自启. # systemctl start fir ...