内功心法 -- java.util.LinkedList<E> (8)
写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对java.util.LinkedList<E>的Iterator操作和数组、克隆操作进行介绍,主要内容包括:
1、LinkedList常用的Iterator操作介绍
2、LinkedList常用的数组和克隆操作进行介绍
参考内容:
1、JDK源码(1.7)
--------------------------------------------------------------------
1、LinkedList常用的Iterator操作介绍
(1) ListIterator<E> listIterator(int index)
功能: 返回此双端队列的ListIterator对象
源代码如下:
/*
返回此双端队列的ListIterator对象
*/
public ListIterator<E> listIterator(int index) {
//检查参数index是合法
checkPositionIndex(index);
//创建一个ListItr对象
return new ListItr(index);
} /*
内部类ListItr
*/
private class ListItr implements ListIterator<E> {
//记录最后一次返回的Node节点
private Node<E> lastReturned = null;
//记录下一次要返回的Node节点
private Node<E> next;
//记录下一次要返回Node节点的索引
private int nextIndex;
//fast-fail机制
private int expectedModCount = modCount; //构造函数
ListItr(int index) {
// assert isPositionIndex(index);
next = (index == size) ? null : node(index);
nextIndex = index;
} //判断是否还有下一个节点
public boolean hasNext() {
return nextIndex < size;
} //返回下一个Node节点
public E next() {
//检查fast-fail机制
checkForComodification();
//如果没有下一个节点了,则抛出异常
if (!hasNext())
throw new NoSuchElementException();
//记录最后返回的节点
lastReturned = next;
//指向下一个节点
next = next.next;
//索引下标加1
nextIndex++;
//返回节点
return lastReturned.item;
} //判断是否有上一个节点
public boolean hasPrevious() {
return nextIndex > 0;
} //返回上一个Node节点
public E previous() {
//检查fast-fail机制
checkForComodification();
//如果没有上一个节点了,则抛出异常
if (!hasPrevious())
throw new NoSuchElementException();
//记录最后返回的节点
lastReturned = next = (next == null) ? last : next.prev;
//索引下标减1
nextIndex--;
//返回节点
return lastReturned.item;
} //返回下一个返回节点的索引下标
public int nextIndex() {
return nextIndex;
} //返回上一个返回节点的索引下标
public int previousIndex() {
return nextIndex - 1;
} //删除最后返回的Node节点
public void remove() {
//检查fast-fail机制
checkForComodification();
//如果没有返回过Node节点,则抛出异常
if (lastReturned == null)
throw new IllegalStateException(); //删除节点,并且重新设置连接
Node<E> lastNext = lastReturned.next;
unlink(lastReturned);
if (next == lastReturned)
next = lastNext;
else
nextIndex--;
lastReturned = null;
expectedModCount++;
} //将最后返回的Node节点的值设置为e
public void set(E e) {
if (lastReturned == null)
throw new IllegalStateException();
checkForComodification();
lastReturned.item = e;
} //将元素e添加到此双端队列中
public void add(E e) {
//检查fast-fail机制
checkForComodification();
lastReturned = null;
if (next == null)
linkLast(e);
else
linkBefore(e, next);
nextIndex++;
expectedModCount++;
}
//检查fast-fail机制
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
(2) Iterator<E> descendingIterator()
功能: 返回此双端队列的Iteraotr对象(逆序)
源代码如下:
/*
功能: 返回此双端队列的Iterator对象(逆序)
*/
public Iterator<E> descendingIterator() {
//创建一个DescendingIterator对象
return new DescendingIterator();
} /**
* 返回此双端队列的Iterator对象(逆序)
*/
private class DescendingIterator implements Iterator<E> {
//创建一个ListItr对象
private final ListItr itr = new ListItr(size()); //判断是否还有下一个元素
public boolean hasNext() {
//逆序
return itr.hasPrevious();
} //返回下一个元素
public E next() {
return itr.previous();
} //删除元素
public void remove() {
itr.remove();
}
}
--------------------------------------------------------------------
2、LinkedList常用的数组和克隆操作进行介绍
(1) Object clone()
功能: 复制此双端队列的对象
源代码如下:
/*
返回一个此双端队列的浅复制
*/
public Object clone() {
LinkedList<E> clone = superClone(); // Put clone into "virgin" state
clone.first = clone.last = null;
clone.size = 0;
clone.modCount = 0; // Initialize clone with our elements
for (Node<E> x = first; x != null; x = x.next)
clone.add(x.item); return clone;
} /*
返回一个此双端队列的浅复制
*/
@SuppressWarnings("unchecked")
private LinkedList<E> superClone() {
try {
return (LinkedList<E>) super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError();
}
}
(2) Object[] toArray()
功能: 将此双端队列中的元素以数组的形式返回
源代码如下:
/*
将此双端队列中的元素以数组的形式返回
*/
public Object[] toArray() {
//创建一个Object类型的数组
Object[] result = new Object[size];
int i = 0;
//循环为数组赋值
for (Node<E> x = first; x != null; x = x.next)
result[i++] = x.item;
return result;
}
(3) T[] toArray(T[] a)
功能: 将此双端队列中的元素以数组的形式返回
源代码如下:
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
if (a.length < size)
a = (T[])java.lang.reflect.Array.newInstance(
a.getClass().getComponentType(), size);
int i = 0;
Object[] result = a;
for (Node<E> x = first; x != null; x = x.next)
result[i++] = x.item; if (a.length > size)
a[size] = null; return a;
}
--------------------------------------------------------------------
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> (8)的更多相关文章
- 内功心法 -- 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> (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,这是一个有链表 ...
随机推荐
- nesC编程入门
1.接口 NesC程序主要由各式组件(component)构成,组件和组件之间通过特定的接口(interface)互相沟通.一个接口内声明了提供相关服务的方法(C语言函数).例如数据读取接口(Read ...
- Mac最新系统bssdb BUG
这个bug在Mac OS更新到10.14时候出现,当前系统版本 ➜ git:(master) sw_vers ProductName: Mac OS X ProductVersion: 10.14 B ...
- struts入门
1.概念
- jquery对象和javascript对象即DOM对象相互转换
jquery对象和javascript对象即DOM对象相互转换 1. DOM 对象转成 jQuery 对象对于已经是一个 DOM 对象,只需要用 $() 把DOM对象包装起来,就可以获得一个 jQue ...
- PIP安装时报The repository located at pypi.douban.com is not a trusted or secure host and is being ignore
C:\WINDOWS\system32>pip install scrapyCollecting scrapy The repository located at pypi.douban.com ...
- linux initcall 介绍 (转自http://blog.csdn.net/fenzhikeji/article/details/6860143)
现在以module_init为例分析initcall在内核中的调用顺序 在头文件init.h中,有如下定义: #define module_init(x) __initcall(x); 很明显 ...
- python 协程嵌套
import asyncio import time now = lambda: time.time() async def do_some_work(x): print('Waiting: ', x ...
- 关于text-decoration无法清除继承的问题
因为text-decoration的值可以叠加,所以即使设置了none,浏览器也是看成是叠加,而不是清除的意思.
- 10.python3标准库--加密
''' 加密可以保护消息安全,以便验证其正确性并保护消息不被截获. python的加密支持包括hashlib和hmac,hashlib使用标准算法生成消息内容签名,hmac则用于验证消息在传输过程中未 ...
- SP 页面缓存以及清除缓存
JSP 页面缓存以及清除缓存 一.概述 缓存的思想可以应用在软件分层的各个层面.它是一种内部机制,对外界而言,是不可感知的. 数据库本身有缓存,持久层也可以缓存.(比如:hibernate,还分1级和 ...