HuTool 工具包 ArrayUtil.zip 方法使用问题
问题: hutool 工具包中的 ArrayUtil.zip(keys, values, true) 方法使用,该方法的第三个参数isOrder在官方docs文档中被翻译为是否有序,该方法 用于将JAVA 中的两个数组压缩拼接为一个Map 对象,当时看到这个解释就先入为主的认为该参数是根据第一个参数中的键做排序输出的结果,实测发现并非如此
代码示例:
/* * ArrayUtil.zip方法传入两个数组,第一个数组为key,第二个数组对应位置为value,此方法在Python中为zip()函数。 * */ String[] keys = {"b", "a", "c"}; Integer[] values = {2,1,3}; //这里的 isOrder 更多的是保证键值对出现的顺序(当参数值为 True 时底层使用了 LinkedHashMap保证链接顺序,否则创建的Map不保证顺序) Map<String, Integer> zipMap = ArrayUtil.zip(keys, values, true);//{b=2, a=1, c=3} Console.log("zipMap",zipMap);
刨根问题:
首先,我们想到的就是官方 API 文档,翻阅文档后发现解释的也非常敷衍(见下图)
只好另寻他路,点进源码我发现zip 方法中 isOrder 参数其实只是在创建 Map 时用到,那我们就看一下MapUtil.newHashMap(size, isOrder);干了什么吧
//ArrayUtil.zip方法 public static <K, V> Map<K, V> zip(K[] keys, V[] values, boolean isOrder) { if (!isEmpty(keys) && !isEmpty(values)) { int size = Math.min(keys.length, values.length); Map<K, V> map = MapUtil.newHashMap(size, isOrder); for(int i = 0; i < size; ++i) { map.put(keys[i], values[i]); } return map; } else { return null; } } //MapUtil.newHashMap public static <K, V> HashMap<K, V> newHashMap(int size, boolean isLinked) { int initialCapacity = (int)((float)size / 0.75F) + 1; //这里工具类只是判断了一下是否有序,如果有序就用LinkedHashMap来创建一个空 map 保证后面 put 进来的键值对有序 return (HashMap)(isLinked ? new LinkedHashMap(initialCapacity) : new HashMap(initialCapacity)); }
可以看到,isOrder参数只是用来决定底层创建HashMap的类型,并不像臆想中的那样根据 keys 排序输出
总结:
学习使用他人的工具类方法一定要刨根问底,不能望文生义,好的学习习惯会避免让以后的自己掉进大坑