写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对java.util.LinkedList<E>的构造方法和6个队列头、尾操作进行介绍,主要内容包括:

1、LinkedList构造方法介绍

2、LinkedList常用6个队头、尾操作介绍

参考内容:

1、JDK源码(1.7)

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

1、LinkedList两个构造方法

1.1、LinkedList构造方法(提供了两种构造方法)

     //第一种: 默认构造函数
public LinkedList() {
} //第二种: 带子队列参数的构造函数
public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
}

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

2、LinkedList常用6个队头、尾操作介绍

(1) void addFirst(E e)

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

示例代码:

 import java.util.LinkedList;

 public class LinkedListDemo {
public static void main(String[] args) {
//创建一个LinkedList对象
LinkedList<Student> linkedList = new LinkedList<Student>(); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu1 = new Student(1,"zhangsan",20);
linkedList.addFirst(stu1);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu2 = new Student(2,"lisi",21);
linkedList.addFirst(stu2);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu3 = new Student(3,"wangwu",22);
linkedList.addFirst(stu3);
System.out.println(linkedList);
}
}
运行结果:
[Student [stuId=1, stuName=zhangsan, stuAge=20]]
[Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=1, stuName=zhangsan, stuAge=20]]
[Student [stuId=3, stuName=wangwu, stuAge=22], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=1, stuName=zhangsan, stuAge=20]] 从运行结果可以看出,调用addFirst(E e)方法往LinkedList对象中添加元素时,所添加的元素都在头部

源代码:

     /*
将元素e插入到此双端队列的头部
*/
public void addFirst(E e) {
//调用内部方法来实现
linkFirst(e);
} /*
私有方法,将元素e链接到此双端队列的头部
*/
private void linkFirst(E e) {
//引用f指向此双端队列的第一个节点(头部节点)
final Node<E> f = first;
//创建一个Node节点
final Node<E> newNode = new Node<>(null, e, f);
//设置此双端队列的first属性指向 刚新创建的Node节点
first = newNode;
//如果此时双端队列中没有节点存在,则设置此双端队列的last属性也指向刚新建的Node节点,否则设置原来的头节点的prev属性指向刚新建的Node节点
if (f == null)
last = newNode;
else
f.prev = newNode;
//双端队列中节点个数加1
size++;
//fast-fail机制加1
modCount++;
}

(2) void addLast(E e)

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

示例代码:

 import java.util.LinkedList;

 public class LinkedListDemo {
public static void main(String[] args) {
//创建一个LinkedList对象
LinkedList<Student> linkedList = new LinkedList<Student>(); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu1 = new Student(1,"zhangsan",20);
linkedList.addLast(stu1);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu2 = new Student(2,"lisi",21);
linkedList.addLast(stu2);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu3 = new Student(3,"wangwu",22);
linkedList.addLast(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]] 可以看出,调用LinkedList的addLast方法是将元素添加到双端队列的尾部

源代码:

     /*
将元素e添加到此双端队列的尾部
*/
public void addLast(E e) {
//调用内部linkLast方法来完成
linkLast(e);
} /*
将元素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++;
}

(3) E getFirst()

功能: 获取,但不移除此双端队列的第一个元素

示例代码:

 import java.util.LinkedList;

 public class LinkedListDemo {
public static void main(String[] args) {
/*********测试LinkedList的'E getFirst()'方法的使用**********/ //创建一个LinkedList对象
LinkedList<Student> linkedList = new LinkedList<Student>(); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu1 = new Student(1,"zhangsan",20);
linkedList.addLast(stu1);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu2 = new Student(2,"lisi",21);
linkedList.addLast(stu2);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu3 = new Student(3,"wangwu",22);
linkedList.addLast(stu3);
System.out.println(linkedList); System.out.println("linkedList.getFirst() = " + linkedList.getFirst()); //创建一个LinkedList对象
LinkedList<Student> linkedList1 = new LinkedList<Student>();
//此时会抛出异常
System.out.println("linkedList1.getFirst() = " + linkedList1.getFirst());
}
} 运行结果:
[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.getFirst() = Student [stuId=1, stuName=zhangsan, stuAge=20]
Exception in thread "main" java.util.NoSuchElementException
at java.util.LinkedList.getFirst(LinkedList.java:242)
at LinkedListDemo.main(LinkedListDemo.java:31)

源代码:

     /*
获取,但不移除此双端队列的第一个元素
*/
public E getFirst() {
//引用f指向此双端队列对象的头节点
final Node<E> f = first;
//如果此双端队列中没有节点元素,则抛出异常
if (f == null)
throw new NoSuchElementException();
//返回此双端队列头节点的值
return f.item;
}

(4) E getLast()

功能: 获取,但不移除此双端队列的最后一个元素

示例代码:

 import java.util.LinkedList;

 public class LinkedListDemo {
public static void main(String[] args) {
/*********测试LinkedList的'E getLast()'方法的使用**********/ //创建一个LinkedList对象
LinkedList<Student> linkedList = new LinkedList<Student>(); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu1 = new Student(1,"zhangsan",20);
linkedList.addLast(stu1);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu2 = new Student(2,"lisi",21);
linkedList.addLast(stu2);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu3 = new Student(3,"wangwu",22);
linkedList.addLast(stu3);
System.out.println(linkedList); System.out.println("linkedList.getLast() = " + linkedList.getLast()); //创建一个LinkedList对象
LinkedList<Student> linkedList1 = new LinkedList<Student>();
//此时会抛出异常
System.out.println("linkedList1.getLast() = " + linkedList1.getLast());
}
} 运行结果:
[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.getLast() = Student [stuId=3, stuName=wangwu, stuAge=22]
Exception in thread "main" java.util.NoSuchElementException
at java.util.LinkedList.getLast(LinkedList.java:255)
at LinkedListDemo.main(LinkedListDemo.java:31)

源代码:

     /*获取,但不移除此双端队列的最后一个元素*/
public E getLast() {
//引用l指向此双端队列对象的尾节点
final Node<E> l = last;
//如果此双端队列中没有节点元素,则抛出异常
if (l == null)
throw new NoSuchElementException();
//返回此双端队列尾节点的值
return l.item;
}

(5) E removeFirst()

功能: 获取并移除此双端队列第一个元素

示例代码:

 import java.util.LinkedList;

 public class LinkedListDemo {
public static void main(String[] args) {
/*********测试LinkedList的'E removeFirst()'方法的使用**********/ //创建一个LinkedList对象
LinkedList<Student> linkedList = new LinkedList<Student>(); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu1 = new Student(1,"zhangsan",20);
linkedList.addLast(stu1);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu2 = new Student(2,"lisi",21);
linkedList.addLast(stu2);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu3 = new Student(3,"wangwu",22);
linkedList.addLast(stu3);
System.out.println(linkedList); System.out.println("linkedList.removeFirst() = " + linkedList.removeFirst());
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.removeFirst() = Student [stuId=1, stuName=zhangsan, stuAge=20]
[Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]

源代码:

     /*
获取并移除此双端队列第一个节点
*/
public E removeFirst() {
//引用f指向此双端队列对象的头节点
final Node<E> f = first;
//如果此双端队列中没有节点元素,则抛出异常
if (f == null)
throw new NoSuchElementException();
//调用内部方法unlinkFirst()方法
return unlinkFirst(f);
} /* */
private E unlinkFirst(Node<E> f) {
// assert f == first && f != null;
//记录此双端队列的头节点
final E element = f.item;
//记录此双端队列的头节点的下一个节点
final Node<E> next = f.next; //将引用设置null,帮助GC回收
f.item = null;
f.next = null; // help GC //赋值此双端队列对象的first属性 = next
first = next;
//如果此双端对象中只有一个节点,则设置此双端队列对象的last属性为null,否则设置next引用指向的节点的prev=null
if (next == null)
last = null;
else
next.prev = null;
//设置双端队列中元素个数减1
size--;
//fast-fail机制加1
modCount++;
//返回删除的节点
return element;
}

(6) E removeLast()

功能: 获取并移除此双端队列的最后一个元素

示例代码:

 import java.util.LinkedList;

 public class LinkedListDemo {
public static void main(String[] args) {
/*********测试LinkedList的'E removeLast()'方法的使用**********/ //创建一个LinkedList对象
LinkedList<Student> linkedList = new LinkedList<Student>(); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu1 = new Student(1,"zhangsan",20);
linkedList.addLast(stu1);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu2 = new Student(2,"lisi",21);
linkedList.addLast(stu2);
System.out.println(linkedList); //创建一个Student对象,并将其添加到LinkedList对象中
Student stu3 = new Student(3,"wangwu",22);
linkedList.addLast(stu3);
System.out.println(linkedList); System.out.println("linkedList.removeLast() = " + linkedList.removeLast());
System.out.println(linkedList); //创建一个LinkedList对象
LinkedList<Student> linkedList2 = new LinkedList<Student>();
//此方法将会抛出异常
linkedList2.removeLast();
}
} 运行结果:
[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.removeLast() = Student [stuId=3, stuName=wangwu, stuAge=22]
[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21]]
Exception in thread "main" java.util.NoSuchElementException
at java.util.LinkedList.removeLast(LinkedList.java:281)
at LinkedListDemo.main(LinkedListDemo.java:31)

源代码:

     /*
获取并移除此双端队列最后一个节点
*/
public E removeLast() {
//引用l指向此双端队列对象的尾节点
final Node<E> l = last;
//如果此双端队列中没有节点元素,则抛出异常
if (l == null)
throw new NoSuchElementException();
//调用内部方法unlinkLast()
return unlinkLast(l);
} /*
获取并移除此双端队列最后一个节点
*/
private E unlinkLast(Node<E> l) {
// assert l == last && l != null;
//记录此双端队列的尾节点
final E element = l.item;
//记录此双端队列的尾节点的前一个节点
final Node<E> prev = l.prev;
//将引用设置null,帮助GC回收
l.item = null;
l.prev = null; // help GC //赋值此双端队列对象的last属性 = prev
last = prev;
//如果此双端对象中只有一个节点,则设置此双端队列对象的first属性为null,否则设置prev引用指向的节点的next=null
if (prev == null)
first = null;
else
prev.next = null;
//设置双端队列中元素个数减1
size--;
//fast-fail机制加1
modCount++;
//返回删除的节点
return element;
}

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

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> (2)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对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. HMM的概述(五个基本元素、两个假设、三个解决的问题)

    一.五个基本元素 HMM是个五元组 λ =( S, O , π ,A,B) S:状态值集合,O:观察值集合,π:初始化概率,A:状态转移概率矩阵,B:给定状态下,观察值概率矩阵   二.两个假设 HM ...

  2. php菜刀分析学习

    这里以eval为例 我们知道, php中的eval能把字符串当代码执行: eval('phpcode'); 注意, 这里的代码要有分号结尾, 我们测试: 我们创建一个最简单的SHELL: <?p ...

  3. apache2启动失败(Failed to start The Apache HTTP Server.)解决方案

    不知道如何启动apache2就启动不来了. 如下图所示: 即使卸载了重新装也是如此 经过测试卸载并清除软件包的配置即可解决 sudo apt-get purge apache2  sudo apt-g ...

  4. 41、和为S的连续正数序列

    一.题目 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  5. python开发规范(转载)

    转载自http://www.cnblogs.com/wangcp-2014/p/4838952.html 目录 代码布局 1.1 缩进 1.2 表达式和语句中的空格 1.3 行的最大长度 1.4 空行 ...

  6. BAT-快速切换JDK1.6/1.7

    Code: @echo OFF rem 修改背景/字体颜色为黑/绿 color 0A rem 自动设置JDK环境变量,本程序不会对 [系统环境变量] 造成破环!不需要重启!! rem 没有%%JAVA ...

  7. Linux内核同步原语之原子操作

    避免对同一数据的并发访问(通常由中断.对称多处理器.内核抢占等引起)称为同步. ——题记 内核源码:Linux-2.6.38.8.tar.bz2 目标平台:ARM体系结构 原子操作确保对同一数据的“读 ...

  8. Deep Learning基础--Softmax求导过程

    一.softmax函数 softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类! 假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个 ...

  9. Machine Learning系列--深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件

    在求取有约束条件的优化问题时,拉格朗日乘子法(Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求取最优值:如果含有不等式 ...

  10. CGIC函数说明

    CGIC函数说明 参考cgic函数说明_Embedded Resources Library Online (C)郝博士 cgiFormResultType cgiFormString( char * ...