内功心法 -- 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,这是一个有链表 ...
随机推荐
- G6踩坑日记
用G6去完成一整个图例的时候,当包裹它的容器满足不了包裹的需求时,我们就需要引入缩略图来解决问题了 缩略图使用方式很简单 引入插件配置就可以了 当我们使用多张图片进行绘图(G6支持使用图片进行构图,原 ...
- attachEvent 中this指向
IE中使用的事件绑定函数与Web标准的不同,而且this指向也不一样,Web标签中的this指向与传统事件绑定中的this一样,是当前目标,但是IE中事件绑定函数中this指向,通过使用call或ap ...
- Skipping 'Android SDK Tools, revision 24.0.2'; it depends on 'Android SDK Platform-tools, revision 20' which was not installed.
前几天,同事问我eclipse android sdk怎么不能更新. 更新界面是显示(mirrors.neusoft.edu.cn:80),但是不能更新. 问题描述如下: URL not found: ...
- NEO发行资产Token
NEO注册发行全局资产(Token 和 Share)功能已经在neo-gui里面集成,发行非常方便, 高级-注册资产 注册Token消耗GAS感人 4990 Gas 点击调用,获取交易ID为资产ID ...
- React 16 源码瞎几把解读 【前戏】 为啥组件外面非得包个标签?
〇.看前准备 1.自行clone react最新代码 2.自行搭建一个能跑react的test项目 一.看表面:那些插件 如何解析JSX 有如下一段代码: // ---- hearder.jsx 组件 ...
- C#:Excel上传服务器后导入数据库
- 关于select联动的两种做法
第一种方法: function dong(){ var getSheng = document.getElementById("sheng"); var get ...
- 45.Jump Game II---贪心---2018大疆笔试题
题目链接 题目大意:与55题类似,只是这里要求出跳数. 法一(借鉴):贪心.cur表示当前能到达的最远距离,pre表示上一次能到达的最远距离,每到一个位置更新一次最远距离cur,如果当前位置超过了上一 ...
- ASP.NET中的状态保持
1.ASP.NET中的状态保持解决方案 2.常用的状态报保持方式 view state ASP.Net的.aspx页面特有,页面级的,就是在页面上的一个隐藏域中保存客户端单独使用的数据的一种方式(b ...
- BootStarp的form表单的基本写法
代码如下: <!DOCTYPE html> <html> <head> <title>BootStrap的基础入门</title> < ...