你什么时候能写出这样的代码系列1

首先我们直接来看一段代码,这个代码是这样的:

我们可以看到k1,v1, k2,v2, k3,v3,那么自然就可以想到k,v的键值对,我们可以再打开源码看的深一点:

这样的方法重载,我想也还好应该没有吓到你,只是到了k10,v10,之后那么就没有必要再这么写下去了,其实Map.of()这个方法对于简单的构建一个Map而言已经够用了,但是站在复用的角度,显然,方法参数列表会更长——还好我们能第一时间想到可变参数列表,不过要我们解决的的是一个线性排列的数据,怎么整合成key-value pair 呢?其实也还好,能想到第i个是key,第i+1个是value,那么我们来看看源码是怎么写的:

我们核心关注几行代码,首先上面的截图从{的匹配来看是不完整的,所以我们目前只关注MapN(Object… input){} 这个构造函数,简单的几行代码,我们来学点java中大神的操作:

if ((input.length & 1) != 0) { // implicit nullcheck of input
throw new InternalError("length is odd");
}

这段代码显示实在检查输入input的长度必须为偶数,这个很好理解,要是我们一顿敲代码是不是很容易敲成下面这样的:

if (input.length = 0 || input.length % 2 != 0 ) {  
throw new InternalError("length is odd");
}

我们平时开发中的确不怎么见到 & 运算符,还有上面代码中的 >> 和~ 运算符

size = input.length >> 1;


len = (len + 1) & ~1; // ensure table is even length

但如果我们回忆一下“电模”这门课,我们还是很容易记起 与或非电路的,还有就是移位运算。

我们可以看下Java中运算符的优先级:

其实我们的编码站在功能性上讲是没有什么问题的,站在性能角度,如果不是特别关注的话,你可能也就不会在意的,这或许就是那些jdk源码贡献者的魅力。

Leave a Reply