HuTool 工具包 ArrayUtil.zip 方法排序问题

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 排序输出

总结:

学习使用他人的工具类方法一定要刨根问底,不能望文生义,好的学习习惯会避免让以后的自己掉进大坑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值