内功心法 -- java.util.LinkedList<E> (4)
写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对java.util.LinkedList<E>的4个位置访问操作进行介绍,主要内容包括:
1、LinkedList常用的4个位置访问操作介绍
参考内容:
1、JDK源码(1.7)
--------------------------------------------------------------------
1、LinkedList常用的4个位置访问操作介绍
(1)E get(int index)
功能: 返回此双端队列中index位置上的节点
示例代码:
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
/*********测试LinkedList的'E get(int index)'方法的使用**********/
//创建一个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);
System.out.println("linkedList.get(2):" + linkedList.get(2));
System.out.println("linkedList:" + linkedList);
//此方法将抛出异常
System.out.println("linkedList.get(5):" + linkedList.get(5));
}
}
运行结果:
linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
linkedList.get(2):Student [stuId=3, stuName=wangwu, stuAge=22]
linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 5, Size: 3
at java.util.LinkedList.checkElementIndex(LinkedList.java:553)
at java.util.LinkedList.get(LinkedList.java:474)
at LinkedListDemo.main(LinkedListDemo.java:27)
源代码如下:
/*
返回此双端队列中index位置上的节点
*/
public E get(int index) {
//检查index参数是否合法,调用内部方法checkElementIndex
checkElementIndex(index); //返回双端队列中index位置上的节点
return node(index).item;
} /*
检查index参数是否合法
*/
private void checkElementIndex(int index) {
//如果不合法,则抛出异常
if (!isElementIndex(index))
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
} /*
检查参数index是合法
*/
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
} /*
返回双端队列index位置上的节点
*/
Node<E> node(int index) {
// assert isElementIndex(index); if (index < (size >> 1)) {
//如果要求返回的节点位置index,在双端队列的前一半,则从头往尾找
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
//如果要求返回的节点位置index,在双端队列的后一半,则从尾往头找
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
(2)E set(int index, E element)
功能: 将此双端队列中index位置上的节点替换为element节点,并返回被替换的节点
示例代码:
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
/*********测试LinkedList的'E set(int index, E element)'方法的使用**********/
//创建一个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);
Student stu4 = new Student(4,"xiaohong",22);
System.out.println("linkedList.set(1,stu4):" + linkedList.set(1,stu4));
System.out.println("linkedList:" + linkedList);
//此方法将抛出异常
System.out.println("linkedList.set(7,stu4):" + linkedList.set(7,stu4));
}
}
运行结果:
linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
linkedList.set(1,stu4):Student [stuId=2, stuName=lisi, stuAge=21]
linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=4, stuName=xiaohong, stuAge=22], Student [stuId=3, stuName=wangwu, stuAge=22]]
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 3
at java.util.LinkedList.checkElementIndex(LinkedList.java:553)
at java.util.LinkedList.set(LinkedList.java:488)
at LinkedListDemo.main(LinkedListDemo.java:28)
源代码如下:
/*
将此双端队列中index位置上的节点替换为element节点,并返回被替换的节点
*/
public E set(int index, E element) {
//检查index参数是否合法
checkElementIndex(index);
//查找双端队列中index位置上的节点
Node<E> x = node(index);
//记录要被替换的节点
E oldVal = x.item;
//设置双端队列中index位置上的节点的值为element
x.item = element;
//返回被替换的老节点
return oldVal;
}
(3)void add(int index, E element)
功能: 将元素element添加到双端队列的index位置上
示例代码:
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
/*********测试LinkedList的'void add(int index, E element)'方法的使用**********/
//创建一个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);
Student stu4 = new Student(4,"xiaohong",22);
linkedList.add(1,stu4);
System.out.println("linkedList:" + linkedList);
//此方法将抛出异常
linkedList.add(7,stu4);
}
}
运行结果:
linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=4, stuName=xiaohong, stuAge=22], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 4
at java.util.LinkedList.checkPositionIndex(LinkedList.java:558)
at java.util.LinkedList.add(LinkedList.java:505)
at LinkedListDemo.main(LinkedListDemo.java:28)
源代码如下:
/*
功能: 将元素element添加到双端队列的index位置
*/
public void add(int index, E element) { //检查参数index是否合法
checkPositionIndex(index); if (index == size){
//添加到双端队列的尾部
linkLast(element);
}
else{
//添加在双端队列的中间
linkBefore(element, node(index));
}
}
(4)E remove(int index)
功能: 将此双端队列的index位置上的元素删除
示例代码:
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
/*********测试LinkedList的'E remove(int index)'方法的使用**********/
//创建一个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);
System.out.println("linkedList.remove(2):" + linkedList.remove(2));
System.out.println("linkedList:" + linkedList);
//此方法将会抛出异常
linkedList.remove(8);
}
}
运行结果:
linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]Exception in thread "main"
linkedList.remove(2):Student [stuId=3, stuName=wangwu, stuAge=22]
linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21]]
java.lang.IndexOutOfBoundsException: Index: 8, Size: 2
at java.util.LinkedList.checkElementIndex(LinkedList.java:553)
at java.util.LinkedList.remove(LinkedList.java:523)
at LinkedListDemo.main(LinkedListDemo.java:27)
源代码如下:
/*
将此双端队列的index位置上的元素删除
*/
public E remove(int index) {
//检查参数index是否合法
checkElementIndex(index);
//删除节点
return unlink(node(index));
} //检查参数index是合法
private void checkElementIndex(int index) {
//调用内部方法isElementIndex检查参数index是合法,不合法则抛出异常
if (!isElementIndex(index))
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
} //检查参数index是否合法
private boolean isElementIndex(int index) {
return index >= 0 && index < size;
} //返回此双端队列index位置上的节点元素
Node<E> node(int index) {
// assert isElementIndex(index); if (index < (size >> 1)) {
//如果要求返回的节点位置index,在双端队列的前一半,则从头往尾找
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
//如果要求返回的节点位置index,在双端队列的后一半,则从尾往头找
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
} /*
删除双端队列中 节点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;
}
--------------------------------------------------------------------
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> (4)的更多相关文章
- 内功心法 -- java.util.LinkedList<E> (3)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对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.LinkedList<E> (2)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对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,这是一个有链表 ...
随机推荐
- 一款已上市MMO手游地图同步方案总结
1. 客户端地图格子的相关知识 在2.5D的MMO游戏里,角色是通过3D的方式渲染,2D的地图是通过2D的方式显示,所以在客户端一般会有三个坐标系: a) 3D坐标系:所有需要3D渲染的角色和光效,都 ...
- WAMP允许外部访问的修改方法
apache配置文件httpd.conf里的 "Require local"改" Require all granted"
- Android中的通信Volley
1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据.Android系统中主要提供了两种方式来进行H ...
- 工具===激活xmind 8
[下载jar包]: https://stormxing.oss-cn-beijing.aliyuncs.com/files/XMindCrack.jar 方法: 打开xmind 8 安装目录的 ...
- nginx升级至1.12.1版本
nginx升级至1.12.1 编号 名称 说明 1 nginx-1.12.1.tar.gz nginx安装程序 2 nginx_upstream_check_module-master.zip 实现后 ...
- Python抽象类和接口类
一.抽象类和接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名) ...
- 5.Python3标准库-日期和时间
''' 不同于int,str,float,Python没有包含对应日期和时间的原生类型,不过提供了3个相应的模块,可以采用多种表示来管理日期和时间值 time模块由底层C库提供与时间相关的函数.它包含 ...
- C/C++——[04] 语句
在 C/C++语言中,语句以“ :”结束.某些情况下,一组语句在一起共同完成某一特定的功能,可以将它们用大括号括起来.我们称之为语句组.语句组可以出现在任何单个语句出现的地方. 1. 分支语句 一般情 ...
- C语言调用正则表达式
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库 ...
- 【转】EventBus 3.0使用详解
原文:https://www.jianshu.com/p/f9ae5691e1bb 01 前言 当我们进行项目开发的时候,往往是需要应用程序的各组件.组件与后台线程间进行通信,比如在子线程中进行请求数 ...