2022-04-19 脑图

乐云一
  • 笔记
  • note
About 859 wordsAbout 3 min

工作总结.png这是2022-04-19做的简单的脑图

总结一下JDK8的一些使用感悟。 首先是数据结构Map Map在JDK7的时候,简单的说就是以下几点:

  1. 头插法,容易出现死链。并且这种插入的操作,其实在这种链表中,基于头尾结点是很不好的。
  2. Hash冲突,链表一直增加
  3. Hash计算,是这样的:计算Hashcode,计算Hash值,%掉集合的容量,得到的就是桶的下表[索引]

顺便提一下研究的Map的put底层。 简单的说就是,首先拿元素和当前map比较,找到桶下表,并且比较是否有相同值; 当确定添加时,扩容。 扩容判断,阈值0.75,rehash,扩容两倍方便迁移运算。

Map在JDK8的时候,改变多的就是结构:

  1. 加入红黑树,链表大于8树化。为什么不用AVL树,因为AVL平衡节点为2,红黑树为1。如果选择AVL树的话,树的翻转更加的消耗性能,不值得。
  2. 尾插法,这个不多说。解决了死链的问题。

然后就是concurrentmap的改变。 也就是简单的几点:

  1. 节点从锁住分段锁seqment,变成锁住链表的头结点。
  2. 在并发的时候,如果遇到并发修改,并且需要扩容迁移节点的时候;有从左 - 节点 - 右,这样的共同工作流程。

不过以上都是Map的JDK8新特性,看过一些八股文的应该也都知道就不多提了 主要是记录一下新语法:函数式接口、链式编程 链式编程是我感觉JDK8最好的更新,Lanmonda语句open in new window。 在代码中的体现最明显的是声明式创建类。 比如在创建线程中:

new Thread(()-> System.out.println(Thread.currentThread().getName()+"创建新线程3")).start();

白话文的说,就是使用Lanmonda表达式,可以省去匿名类的体现,明确链式编程创建类。 这样有很明显的缺陷,表达式体中代码逻辑较多时,严重影响代码的阅读性。 其次就是通过Lanmonda的形式,定义一个方法

    public static void main(String args[]) {
        final int num = 1;
        Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
        s.convert(2);  // 输出结果为 3
    }
 
    public interface Converter<T1, T2> {
        void convert(int i);
    }

不过不推荐使用,在实际开发中,既然需要定义某个方法,还是基于面向接口开发的理念;将方法设计出来的好。 函数式接口 Functional Interface是JDK8引入的非常有趣的一批接口类。 虽然在平时的项目开发中遇见的很少很少,但是在当前主流的很多工具或框架中,许多广面很大的方法都是基于函数式接口入参去开发。 比如HuTool,其中就基于Fuction<T,R>定义了很多很多的“设计规则”。 而在之前https://leyuna.xyz/#/blog?blogId=1515685427954331650open in new window的文章中,我也是初步使用了Fuction<T,R>去定义了一个唯一规则。 而除了Fuction外,JDK8甚至提供了43种类接口,这可是一比宝藏,之后可得多研究emo

Last update:
Contributors: leyunone
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v2.14.7