内功心法 -- java.util.LinkedList<E> (2)
写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对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)的更多相关文章
- 内功心法 -- java.util.LinkedList<E> (3)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.LinkedList<E> (4)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.LinkedList<E> (5)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.LinkedList<E> (6)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.LinkedList<E> (7)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.LinkedList<E> (8)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.LinkedList<E> (1)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- java.util.ArrayList、java.util.vector和java.util.LinkedList (JDK 1.8.0_111)
一.java.util.ArrayList 1.1 ArrayList 继承结构 ArrayList实现了RandomAccess,可以随机访问(其实就是通过数组下标访问):实现了Cloneable, ...
- JDK1.8源码(六)——java.util.LinkedList 类
上一篇博客我们介绍了List集合的一种典型实现 ArrayList,我们知道 ArrayList 是由数组构成的,本篇博客我们介绍 List 集合的另一种典型实现 LinkedList,这是一个有链表 ...
随机推荐
- HMM的概述(五个基本元素、两个假设、三个解决的问题)
一.五个基本元素 HMM是个五元组 λ =( S, O , π ,A,B) S:状态值集合,O:观察值集合,π:初始化概率,A:状态转移概率矩阵,B:给定状态下,观察值概率矩阵 二.两个假设 HM ...
- php菜刀分析学习
这里以eval为例 我们知道, php中的eval能把字符串当代码执行: eval('phpcode'); 注意, 这里的代码要有分号结尾, 我们测试: 我们创建一个最简单的SHELL: <?p ...
- apache2启动失败(Failed to start The Apache HTTP Server.)解决方案
不知道如何启动apache2就启动不来了. 如下图所示: 即使卸载了重新装也是如此 经过测试卸载并清除软件包的配置即可解决 sudo apt-get purge apache2 sudo apt-g ...
- 41、和为S的连续正数序列
一.题目 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...
- python开发规范(转载)
转载自http://www.cnblogs.com/wangcp-2014/p/4838952.html 目录 代码布局 1.1 缩进 1.2 表达式和语句中的空格 1.3 行的最大长度 1.4 空行 ...
- BAT-快速切换JDK1.6/1.7
Code: @echo OFF rem 修改背景/字体颜色为黑/绿 color 0A rem 自动设置JDK环境变量,本程序不会对 [系统环境变量] 造成破环!不需要重启!! rem 没有%%JAVA ...
- Linux内核同步原语之原子操作
避免对同一数据的并发访问(通常由中断.对称多处理器.内核抢占等引起)称为同步. ——题记 内核源码:Linux-2.6.38.8.tar.bz2 目标平台:ARM体系结构 原子操作确保对同一数据的“读 ...
- Deep Learning基础--Softmax求导过程
一.softmax函数 softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类! 假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个 ...
- Machine Learning系列--深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
在求取有约束条件的优化问题时,拉格朗日乘子法(Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求取最优值:如果含有不等式 ...
- CGIC函数说明
CGIC函数说明 参考cgic函数说明_Embedded Resources Library Online (C)郝博士 cgiFormResultType cgiFormString( char * ...