集合-LinkList
参考:http://www.cnblogs.com/skywang12345/p/3308807.html
Consumer.class 消费者接口
参考:https://www.jianshu.com/p/63771441ba31
https://blog.csdn.net/qq_28410283/article/details/80618456
public class ConsumerTest {
public static void main(String[] args) {
//testConsumer();
testAndThen();
}
public static void testConsumer(){
Consumer<Integer> square=x->System.out.println("print square: "+x*x);
square.accept(2);
}
public static void testAndThen() {
Consumer<Integer> consumer1=x->System.out.println("first x :"+x);
Consumer<Integer> consumer2=x->{
System.out.println("second x: "+x);
throw new NullPointerException("throw exception test");
};
Consumer<Integer> consumer3=x->System.out.println("third x: "+x);
consumer1.andThen(consumer2).andThen(consumer3).accept(1);
}
}
函数式编程与lambda表达式:
https://www.cnblogs.com/snowInPluto/p/5981400.html
https://www.cnblogs.com/Dorae/p/7769868.html
https://www.cnblogs.com/CarpenterLee/p/6729368.html
LinkList.class public boolean addAll(int index, Collection<? extends E> c)
public boolean addAll(int index, Collection<? extends E> c) { 将一个集合c插入到链表中,index的位置
checkPositionIndex(index);
Object[] a = c.toArray();
int numNew = a.length;
if (numNew == 0)
return false;
Node<E> pred, succ;
if (index == size) { 若是插入到最后一个元素的后面
succ = null; 这个元素指向null
pred = last; 这个元素的前向指针指向之前的最后一个元素
} else {
succ = node(index); 这个元素后向指针指向原来index处的元素
pred = succ.prev; 这个元素前向指针指向原来index处元素的前一个元素
}
for (Object o : a) { 将这些元素挨个的插入进链表
@SuppressWarnings("unchecked") E e = (E) o;
Node<E> newNode = new Node<>(pred, e, null); 将插元素的前向指针指向前一个元素
if (pred == null)
first = newNode;
else
pred.next = newNode; 将前一个元素的后向指针指向当前插入的元素
pred = newNode; 往后移一位
}
if (succ == null) {
last = pred;
} else {
pred.next = succ;
succ.prev = pred;
}
size += numNew;
modCount++;
return true;
}
Node<E> node(int index) { 这里采用二分法去查找 链表上第index个元素
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++) 从链表第一个元素开始往后查找
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--) 从链表最后一个往前查找
x = x.prev;
return x;
}
}
每一个链表节点的数据结构:
private static class Node<E> {
E item; 当前元素
Node<E> next; 下一个元素
Node<E> prev; 上一个元素 Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
private E unlinkFirst(Node<E> f) { 将第一个元素从链表的关联中去除
// assert f == first && f != null;
final E element = f.item;
final Node<E> next = f.next;
f.item = null;
f.next = null; // help GC
first = next;
if (next == null)
last = null;
else
next.prev = null;
size--;
modCount++;
return element;
}
/**
* Unlinks non-null last node l.
*/
private E unlinkLast(Node<E> l) { 将最后一个元素从链表的关联中去除
// assert l == last && l != null;
final E element = l.item;
final Node<E> prev = l.prev;
l.item = null;
l.prev = null; // help GC
last = prev;
if (prev == null)
first = null;
else
prev.next = null;
size--;
modCount++;
return element;
}
private void linkFirst(E e) { 创建一个新的节点,与第一个节点关联起来
final Node<E> f = first;
final Node<E> newNode = new Node<>(null, e, f); 创建的新节点后向指针指向第一个节点
first = newNode;
if (f == null)
last = newNode;
else
f.prev = newNode; 将第一个节点对的前向指针指向新创建的节点
size++;
modCount++;
}
/**
* Links e as last element.
*/
void linkLast(E e) { 创建一个新的节点,与最后一个节点关联起来
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null); 将新创建的节点指向最后的节点
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode; 将那个最后的节点指向新创建的节点
size++;
modCount++;
}
public int indexOf(Object o) { 返回元素o在链表中的索引 若是不存在则返回-1
int index = 0;
if (o == null) {
for (Node<E> x = first; x != null; x = x.next) {
if (x.item == null) 若是需要查找的元素为null,就遍历链表中的值是否有null
return index;
index++;
}
} else {
for (Node<E> x = first; x != null; x = x.next) {
if (o.equals(x.item)) 查找元素的索引
return index;
index++;
}
}
return -1;
}
public void clear() { 对链表进行清除
// Clearing all of the links between nodes is "unnecessary", but:
// - helps a generational GC if the discarded nodes inhabit
// more than one generation
// - is sure to free memory even if there is a reachable Iterator
for (Node<E> x = first; x != null; ) {
Node<E> next = x.next;
x.item = null; 置为null GC会对内存进行回收
x.next = null;
x.prev = null;
x = next;
}
first = last = null;
size = 0;
modCount++;
}
集合-LinkList的更多相关文章
- collection set
http://blog.csdn.net/humingfiy/article/details/7946408 Collection:List.SetMap:HashMap.HashTable 如何在它 ...
- Java学习历程记录(一)
一.类与对象 1.创建类 创建一个学生类.并且创造成员变量和方法 public class student{ String name: int age: public void study(参数列表) ...
- Java集合(2)一 ArrayList 与 LinkList
目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树.TreeMap与TreeSet(上) Java集合(4)一 红黑树. ...
- Java集合之ArrayList与LinkList
注:示例基于JDK1.8版本 参考资料:Java知音公众号 本文超长,也是搬运的干货,希望小伙伴耐心看完. Collection集合体系 List.Set.Map是集合体系的三个接口. 其中List和 ...
- java集合系列之LinkList
概要 第1部分 LinkedList介绍第2部分 LinkedList数据结构第3部分 LinkedList源码解析(基于JDK1.6.0_45) 第5部分 LinkedList示例 转载请注明出处 ...
- Java集合篇二:LinkList
package com.test.collection; /** * 自定义实现LinkList * * 1.双向链表 * 实现原理:底层封装Node节点对象(每个节点存放有3部分内容:1.上个节点的 ...
- Java集合之LinkedHashMap
一.初识LinkedHashMap 上篇文章讲了HashMap.HashMap是一种非常常见.非常有用的集合,但在多线程情况下使用不当会有线程安全问题. 大多数情况下,只要不涉及线程安全问题,Map基 ...
- java从基础知识(七)java集合
一.集合类介绍 1.List(元素有放入顺序,可重复) 1.1.List的实现 1.1.1.ArrayList ArrayList就是动态数组(需要连续的存储空间),用MSDN中的说法,就是Array ...
- 图解集合6:LinkedHashMap
初识LinkedHashMap 上两篇文章讲了HashMap和HashMap在多线程下引发的问题,说明了,HashMap是一种非常常见.非常有用的集合,并且在多线程情况下使用不当会有线程安全问题. 大 ...
随机推荐
- Maven添加本地依赖
在写本文的时候先来说明一下maven依赖的各种范围的意思 compile(编译范围) compile 是默认的范围:如果没有提供一个范围,那该依赖的范围就是编译范围.编译范围依赖在所有的c ...
- Educational Codeforces Round 12补题 经典题 再次爆零
发生了好多事情 再加上昨晚教育场的爆零 ..真的烦 题目链接 A题经典题 这个题我一开始推公式wa 其实一看到数据范围 就算遍历也OK 存在的问题进制错误 .. 思路不清晰 两个线段有交叉 并不是端点 ...
- Java IO file文件的写入和读取及下载
一.FileWriter 和BufferedWriter 结合写入文件 FileWriter是字符流写入字符到文件.默认情况下,它会使用新的内容代替文件原有的所有内容,但是,当指定一个true值作为F ...
- (5)JSTL的xml标签库
Jstl的XML标签库 JSTL提供了操作xml文件的标签库,使用xml标签库可以省去使用Dom和SAX标签库的繁琐,能轻松的读取xml文件的内容. <%@ taglib uri="h ...
- 安装pycharm 2018.3 Professional Edition
1.下载pycharm 2018.3 Professional 2.下载破解补丁,Gitee仓库 或 直接下载(Direct download link) ,并放到pycharm目录下的\bin目录( ...
- shell脚本,实现奇数行等于偶数行。
请把如下字符串stu494e222fstu495bedf3stu49692236stu49749b91转为如下形式:stu494=e222fstu495=bedf3stu496=92236stu497 ...
- shell脚本,文件里面的英文大小写替换方法。
[root@localhost wyb]# cat daxiaoxie qweBNMacb eeeDFSmkl svdIOPtyu [root@localhost wyb]# cat daxiaoxi ...
- 请大神看看10.10Beta1的AppleRTC怎么破?原版会导致BIOS重置!
看起来 跟10.9一样 sudo perl -pi -e 's|\x75\x2e\x0f\xb6|\xeb\x2e\x0f\xb6|' /System/Library/Extensions/Apple ...
- Codeforces Round #477滚粗记&&祭第一次div2场
4.29 - 23:58:现在似乎在ST的样子……先等一波 Day4.29 prescript : 难得遇上一场9:00开始的div2,看了看大家都打,索性也当一回神仙吧. 晚上出去吃饭,匆匆赶回家, ...
- vim的卸载以及环境的配置小记
一.背景 由于之前配置错误,导致我的YouCompleteMe这个插件不能用了,一直提示: ERROR:Required vim compiled with +python. YouCompleteM ...