写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对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)的更多相关文章

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

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对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. Sqlmap注入技巧收集整理

    TIP1 当我们注射的时候,判断注入 http://site/script?id=10http://site/script?id=11-1 # 相当于 id=10http://site/script? ...

  2. qq上传文件进行测试要点分析

    功能 QQ 兼容性 1.Win系统/Mac系统  Android/IOS 品牌 传 1.上传方式:直接拖拽,按回车键上传 2.多个文件同时上传给一人/多人(考虑稳定性,是否存在内存泄露) 3.不是好友 ...

  3. UNDO自我理解总结

    [场景] 当在更新数据的时候,发现更新的值写错了,这时就需要将已经更新的地方恢复到原始数据. [基本概念] 在更新的过程中,Oracle会将原始的数据都放入到UNDO里,这样当以上情况发生后,就可以从 ...

  4. Linux系统调优及安全设置

    1.关闭SELinux #临时关闭 setenforce 0 #永久关闭 vim /etc/selinux/config SELINUX=disabled 2.设定运行级别为3 #设定运行级别 vim ...

  5. MySQL 视图、触发器、函数、存储过程

    1. 视图 1.1 什么是视图 通俗来讲,视图就是一条 select 语句执行后返回的结果集.所有我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上. 1.2 视图的特性 视图是对若干张基 ...

  6. ASP .NET CORE MVC 部署Windows 系统上 IIS具体步骤---.Net Core 部署到 IIS位系统中的步骤

    一.IIS 配置 启用 Web 服务器 (IIS) 角色并建立角色服务. 1.Windows Ddesktop 桌面操作系统(win7及更高版本) 导航到“控制面板” > “程序” > “ ...

  7. shell之read命令

    一.概述 read命令接收标准输入(键盘)的输入,或者其他文件描述符的输入.得到输入后,read命令将数据放入一个标准变量中. 二.使用举例(这里仅列出一些常用的选项) 1.基本读取 #!/bin/b ...

  8. python合并图片

    因项目需求需要将图片合并故写了一个python脚本,在这里放个笔记 #!/usr/bin/env python #coding=utf-8 import Image import os import ...

  9. 一道关于数据库(经典父子级 ID 关联)更新题,大家帮忙想想还有其它解决思路没有?

    昨天,一同事发过来的一道数据库题目,就是哪种经典的父子级 ID 在同一数据库表中设计类型.需要在原表中添加一个字段,同时,将该节点的父子级详细信息插入到原表新增的一字段中,具体效果如下图. AreaC ...

  10. 【LOJ】#2173. 「FJOI2016」建筑师

    题解 蒟蒻只会\(O(nAB)\)的dp= = 那么先说答案 \(S_{u}(n - 1,a + b - 2) * \binom{a + b - 2}{a - 1}\) 其中\(S_{u}(n,m)\ ...