写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对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. 二. Jmeter--关联

    1. 首先建立一个线程组(Thread Group),为什么所有的请求都要加入线程组这个组件呢?不加不行吗?答案当然是不行的.因为jmeter的所有任务都必须由线程处理,所有任务都必须在线程组下面创建 ...

  2. 【转载】在GitHub上管理项目

    在GitHub上管理项目 新建repository 本地目录下,在命令行里新建一个代码仓库(repository) 里面只有一个README.md 命令如下: touch README.md git ...

  3. python之jsonpath的使用

    import json import jsonpath import requests url="https://www.lagou.com/lbs/getAllCitySearchLabe ...

  4. Java文件上传与下载

    文件上传与下载可谓上网中的常见现象.apache为我们准备了用于文件上传与下载的两个jar包(commons-fileupload-1.2.1.jar,commons-io-1.4.jar).我们在w ...

  5. php判断是手机还是pc访问从而走不同url

    <?php header("Content-type:text/html;charset=utf-8"); function is_mobile(){ $user_agent ...

  6. 机顶盒 gettimeofday()获取毫秒溢出

    最近在写代码的时候遇见了一个bug,在获取当前时间戳的毫秒时,我自己测试的时候总是OK的,但是测试那边总是测不对,之前一直以为是因为我存储的类型的不对,从long long类型从lld改成llu,然后 ...

  7. hdu 5001(概率DP)

    Walk Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  8. 【58沈剑架构系列】细聊分布式ID生成方法

    一.需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识:message-id (2)订单标识:order-id (3)帖子标识:tiezi-id 这个记录标识往往就是数据 ...

  9. hdu4347

    求与询问点欧几里德距离前m小的点 其实就是在kdtree询问的时候用优先队列维护一下就好了 好久没写kdtree练一练,注意这道题是多测 #include<bits/stdc++.h> u ...

  10. Java 中的静态嵌套类和非静态嵌套类

    Java 中的静态嵌套类和非静态嵌套类 术语:嵌套类分为两类:静态嵌套类和非静态嵌套类.声明 static 的嵌套类称为静态嵌套类,非静态嵌套类也称为内部类. class OuterClass { p ...