跳转至

JDK 8

lambda

:: 关键字

  1. 静态方法语法
import java.util.Arrays;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan("com.zhoufy")
public class Demo {
 @Test
 public void test() {
     List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");

     //静态方法语法    ClassName::methodName
     list.forEach(Demo::print);
 }

 public static void print(String content){
     System.out.println(content);
 }
}
  1. 类实例方法语法
import java.util.Arrays;
import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ComponentScan("com.zhoufy")
public class Demo {
 @Test
 public void test() {
     List<String> list = Arrays.asList("aaaa", "bbbb", "cccc");

     //对象实例语法    instanceRef::methodName
     list.forEach(new Demo()::print);
 }

 public void print(String content){
     System.out.println(content);
 }
}
  1. 超类方法语法

  2. 类构造器语法

  3. 数组构造器语法

public class Example {
 public static void main(String[] args) {
     Interface <Integer, Example[]> function = Example[]::new;
     Example[] array = function.apply(4);    //这里的4是数组的大小
     for(Example e:array){
         System.out.println(e);
     }
 }
}

@FunctionalInterface
interface Interface<A, T>{
 T apply(A a); 
}

JAVA 8 '::' 关键字,带你深入了解它!_男人要霸气的博客-CSDN博客

深入理解Java双冒号(::)运算符的使用_扬帆舟的博客-CSDN博客

IO

集合

HashMap

put

put 方法中,if ((p = tab[i = (n - 1) & hash]) == null)中的 (n - 1) & hash 是什么意思?

其实就是 hash % n

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
    Node<K,V>[] tab; Node<K,V> p; int n, i;
    // table未初始化或者长度为0,进行扩容
    if ((tab = table) == null || (n = tab.length) == 0)
        n = (tab = resize()).length;
    // (n - 1) & hash 确定元素存放在哪个桶中,桶为空,新生成结点放入桶中(此时,这个结点是放在数组中)
    if ((p = tab[i = (n - 1) & hash]) == null)
        tab[i] = newNode(hash, key, value, null);
    // 桶中已经存在元素
    else {
        Node<K,V> e; K k;
        // 比较桶中第一个元素(数组中的结点)的hash值相等,key相等
        if (p.hash == hash &&
            ((k = p.key) == key || (key != null && key.equals(k))))
                // 将第一个元素赋值给e,用e来记录
                e = p;
        // hash值不相等,即key不相等;为红黑树结点
        else if (p instanceof TreeNode)
            // 放入树中
            e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
        // 为链表结点
        else {
            // 在链表最末插入结点
            for (int binCount = 0; ; ++binCount) {
                // 到达链表的尾部
                if ((e = p.next) == null) {
                    // 在尾部插入新结点
                    p.next = newNode(hash, key, value, null);
                    // 结点数量达到阈值,转化为红黑树
                    if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                        treeifyBin(tab, hash);
                    // 跳出循环
                    break;
                }
                // 判断链表中结点的key值与插入的元素的key值是否相等
                if (e.hash == hash &&
                    ((k = e.key) == key || (key != null && key.equals(k))))
                    // 相等,跳出循环
                    break;
                // 用于遍历桶中的链表,与前面的e = p.next组合,可以遍历链表
                p = e;
            }
        }
        // 表示在桶中找到key值、hash值与插入元素相等的结点
        if (e != null) { 
            // 记录e的value
            V oldValue = e.value;
            // onlyIfAbsent为false或者旧值为null
            if (!onlyIfAbsent || oldValue == null)
                //用新值替换旧值
                e.value = value;
            // 访问后回调
            afterNodeAccess(e);
            // 返回旧值
            return oldValue;
        }
    }
    // 结构性修改
    ++modCount;
    // 实际大小大于阈值则扩容
    if (++size > threshold)
        resize();
    // 插入后回调
    afterNodeInsertion(evict);
    return null;
} 

// ————————————————
// 版权声明:本文为CSDN博主「thetimelyrain」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
// 原文链接:https://blog.csdn.net/thetimelyrain/article/details/99873881

取余(%)操作中如果除数是2的幂次则等价于与其除数减一的与(&)操作,这也是 HashMap 容量为二的幂次的原因。

TODO: https://blog.csdn.net/taoshengyang/article/details/7235319

TODO: https://blog.csdn.net/thetimelyrain/article/details/99873881

多线程

ThreadPoolExecutor

略。本 wiki 里有专门的文章介绍过。

Spring

Spring Boot Starter 原理

https://blog.csdn.net/songzehao/article/details/100837463

设计模式

单例

工厂

适配器