本文以jdk1.8中HashMap.compute()方法为切入点,分析其中难理解、有价值的源码片段(类似源码查看是ctrl+鼠标左键的过程)。本篇涉及少许Java8(以下简称J8)新特性,请驴友们系好安全带,准备开车。观光线路图:compute() –> BiFunction –> @FunctionalInterface –> afterNodeAccess() –> computeIfAbsent() –> computeIfPresent()…
☞ compute()
|
|
compute()是java8在Map中新增的一个方法,相对而言较为陌生。其作用是把remappingFunction的计算结果关联到key上(即remappingFunction返回值作为新value)。写一段它的简单应用的代码,并与“同级生”merge()类比加深理解:
|
|
下面用一张表来总结源码最后的判断对应的操作:
☞ BiFunction
|
|
是的,这也J8新增的梗。当我第一眼看到逼函数(BiFunction)的时候就原地炸了。实际上,“Bi”乃binary缩写,即“二元函数”之意(类似“1+1=2”)。这类接口称为“函数式接口”,可以看出,它的方法有方法体。且以“default”修饰符修饰,不影响接口的实现类,算是一种向下兼容吧。
☞ @FunctionalInterface
|
|
“@FunctionalInterface”并非必须,就像javascript中的“use strict”,使得编译器能检查该接口是否存在语法错误。此外,从注释还可以看出:
函数接口仅有一个抽象方法;
default方法、Object的重载方法(、静态方法)非抽象方法;
☞ afterNodeAccess()
|
|
从注释可以看到这是为LinkedHashMap留的后路,不过HashMap存取操作中经常发现他们的身影,即使实现为空。。
☞ computeIfAbsent()/computeIfPresent()
|
|
computeIfAbsent()与computeIfPresent()可以说是compute()的“子集”。
这次的功夫主要花在了学习J8的知识点上,经过前2篇后HashMap本身不再那么可怕。你觉得呢?
更多有意思的内容,欢迎访问笔者小站: rebey.cn
彩蛋
最后分享几个学习Java8过程中看到良心网址(以下链接为网站系列文章之一,希望细心的你举一反三):