参考: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的更多相关文章

  1. collection set

    http://blog.csdn.net/humingfiy/article/details/7946408 Collection:List.SetMap:HashMap.HashTable 如何在它 ...

  2. Java学习历程记录(一)

    一.类与对象 1.创建类 创建一个学生类.并且创造成员变量和方法 public class student{ String name: int age: public void study(参数列表) ...

  3. Java集合(2)一 ArrayList 与 LinkList

    目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树.TreeMap与TreeSet(上) Java集合(4)一 红黑树. ...

  4. Java集合之ArrayList与LinkList

    注:示例基于JDK1.8版本 参考资料:Java知音公众号 本文超长,也是搬运的干货,希望小伙伴耐心看完. Collection集合体系 List.Set.Map是集合体系的三个接口. 其中List和 ...

  5. java集合系列之LinkList

    概要  第1部分 LinkedList介绍第2部分 LinkedList数据结构第3部分 LinkedList源码解析(基于JDK1.6.0_45) 第5部分 LinkedList示例 转载请注明出处 ...

  6. Java集合篇二:LinkList

    package com.test.collection; /** * 自定义实现LinkList * * 1.双向链表 * 实现原理:底层封装Node节点对象(每个节点存放有3部分内容:1.上个节点的 ...

  7. Java集合之LinkedHashMap

    一.初识LinkedHashMap 上篇文章讲了HashMap.HashMap是一种非常常见.非常有用的集合,但在多线程情况下使用不当会有线程安全问题. 大多数情况下,只要不涉及线程安全问题,Map基 ...

  8. java从基础知识(七)java集合

    一.集合类介绍 1.List(元素有放入顺序,可重复) 1.1.List的实现 1.1.1.ArrayList ArrayList就是动态数组(需要连续的存储空间),用MSDN中的说法,就是Array ...

  9. 图解集合6:LinkedHashMap

    初识LinkedHashMap 上两篇文章讲了HashMap和HashMap在多线程下引发的问题,说明了,HashMap是一种非常常见.非常有用的集合,并且在多线程情况下使用不当会有线程安全问题. 大 ...

随机推荐

  1. Maven添加本地依赖

    在写本文的时候先来说明一下maven依赖的各种范围的意思 compile(编译范围)       compile 是默认的范围:如果没有提供一个范围,那该依赖的范围就是编译范围.编译范围依赖在所有的c ...

  2. Educational Codeforces Round 12补题 经典题 再次爆零

    发生了好多事情 再加上昨晚教育场的爆零 ..真的烦 题目链接 A题经典题 这个题我一开始推公式wa 其实一看到数据范围 就算遍历也OK 存在的问题进制错误 .. 思路不清晰 两个线段有交叉 并不是端点 ...

  3. Java IO file文件的写入和读取及下载

    一.FileWriter 和BufferedWriter 结合写入文件 FileWriter是字符流写入字符到文件.默认情况下,它会使用新的内容代替文件原有的所有内容,但是,当指定一个true值作为F ...

  4. (5)JSTL的xml标签库

    Jstl的XML标签库 JSTL提供了操作xml文件的标签库,使用xml标签库可以省去使用Dom和SAX标签库的繁琐,能轻松的读取xml文件的内容. <%@ taglib uri="h ...

  5. 安装pycharm 2018.3 Professional Edition

    1.下载pycharm 2018.3 Professional 2.下载破解补丁,Gitee仓库 或 直接下载(Direct download link) ,并放到pycharm目录下的\bin目录( ...

  6. shell脚本,实现奇数行等于偶数行。

    请把如下字符串stu494e222fstu495bedf3stu49692236stu49749b91转为如下形式:stu494=e222fstu495=bedf3stu496=92236stu497 ...

  7. shell脚本,文件里面的英文大小写替换方法。

    [root@localhost wyb]# cat daxiaoxie qweBNMacb eeeDFSmkl svdIOPtyu [root@localhost wyb]# cat daxiaoxi ...

  8. 请大神看看10.10Beta1的AppleRTC怎么破?原版会导致BIOS重置!

    看起来 跟10.9一样 sudo perl -pi -e 's|\x75\x2e\x0f\xb6|\xeb\x2e\x0f\xb6|' /System/Library/Extensions/Apple ...

  9. Codeforces Round #477滚粗记&&祭第一次div2场

    4.29 - 23:58:现在似乎在ST的样子……先等一波 Day4.29 prescript : 难得遇上一场9:00开始的div2,看了看大家都打,索性也当一回神仙吧. 晚上出去吃饭,匆匆赶回家, ...

  10. vim的卸载以及环境的配置小记

    一.背景 由于之前配置错误,导致我的YouCompleteMe这个插件不能用了,一直提示: ERROR:Required vim compiled with +python. YouCompleteM ...