hutool(集合工具-CollUtil)

介绍

这个工具主要增加了对数组、集合类的操作。

join 方法
将集合转换为字符串,这个方法还是挺常用,是StrUtil.split的反方法。这个方法的参数支持各种类型对象的集合,最后连接每个对象时候调用其toString()方法。栗子如下:

String[] col= new String[]{"a","b","c","d","e"};
List<String> colList = CollUtil.newArrayList(col);

String str = CollUtil.join(colList, "#"); //str -> a#b#c#d#e

sortPageAll、sortPageAll2方法
这个方法其实是一个真正的组合方法,功能是:将给定的多个集合放到一个列表(List)中,根据给定的Comparator对象排序,然后分页取数据。这个方法非常类似于数据库多表查询后排序分页,这个方法存在的意义也是在此。sortPageAll2功能和sortPageAll的使用方式和结果是 一样的,区别是sortPageAll2使用了BoundedPriorityQueue这个类来存储组合后的列表,不知道哪种性能更好一些,所以就都保留了。使用此方法,栗子如下:

//Integer比较器
Comparator<Integer> comparator = new Comparator<Integer>(){
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);
    }
};

//新建三个列表,CollUtil.newArrayList方法表示新建ArrayList并填充元素

List<Integer> list1 = CollUtil.newArrayList(1, 2, 3);
List<Integer> list2 = CollUtil.newArrayList(4, 5, 6);
List<Integer> list3 = CollUtil.newArrayList(7, 8, 9);

//参数表示把list1,list2,list3合并并按照从小到大排序后,取0~2个(包括第0个,不包括第2个),结果是[1,2]

@SuppressWarnings("unchecked")
List<Integer> result = CollUtil.sortPageAll(0, 2, comparator, list1, list2, list3);
System.out.println(result);     //输出 [1,2]

sortEntrySetToList方法
这个方法主要是对Entry<Long, Long>按照Value的值做排序,使用局限性较大,我已经忘记哪里用到过了……

popPart方法
这个方法传入一个栈对象,然后弹出指定数目的元素对象,弹出是指pop()方法,会从原栈中删掉。

append方法
在给定数组里末尾加一个元素,其实List.add()也是这么实现的,这个方法存在的意义是只有少量的添加元素时使用,因为内部使用了System.arraycopy,每调用一次就要拷贝数组一次。这个方法也是为了在某些只能使用数组的情况下使用,省去了先要转成List,添加元素,再转成Array。

7. resize方法
重新调整数据的大小,如果调整后的大小比原来小,截断,如果比原来大,则多出的位置空着。(貌似List在扩充的时候会用到类似的方法)

addAll方法
将多个数据合并成一个数组

sub方法
对集合切片,其他类型的集合会转换成List,封装List.subList方法,自动修正越界等问题,完全避免IndexOutOfBoundsException异常。

isEmpty、isNotEmpty方法
判断集合是否为空(包括null和没有元素的集合)。

zip方法
此方法也是来源于Python的一个语法糖,给定两个集合,然后两个集合中的元素一一对应,成为一个Map。此方法还有一个重载方法,可以传字符,然后给定分分隔符,字符串会被split成列表。栗子:

Collection<String> keys = CollUtil.newArrayList("a", "b", "c", "d");
Collection<Integer> values = CollUtil.newArrayList(1, 2, 3, 4);

// {a=1,b=2,c=3,d=4}
Map<String, Integer> map = CollUtil.zip(keys, values);
该错误通常是由于在迭代列表的同时修改了列表的结构而引起的。在你的代码中,可能有以下几个原因导致该错误: 1. 并发修改:如果在迭代 `resultList` 的同时,另外一个线程对该列表进行了修改,就会抛出 `ConcurrentModificationException` 异常。这可能是因为在多线程环境下访问了同一个列表,而且没有采取适当的同步措施。 2. 迭代器遍历和修改:如果在迭代 `resultList` 的同时,通过迭代器以外的方式修改了列表的结构(比如使用 `add`、`remove` 方法),就会抛出 `ConcurrentModificationException` 异常。迭代器遍历期间不允许直接修改列表的结构。 3. 非并发修改:如果在迭代 `resultList` 的同时,使用了 `CollUtil.split` 方法对列表进行了修改,也会导致 `ConcurrentModificationException` 异常。这是因为 `CollUtil.split` 方法会返回一个新的列表,而原始列表可能仍然处于迭代状态。 为了解决这个问题,你可以尝试以下几个解决方案: 1. 使用同步机制:如果在多线程环境下操作同一个列表,确保在访问和修改列表时采取适当的同步措施,如使用锁或其他并发控制机制。 2. 使用迭代器:使用迭代器进行列表遍历,并且只通过迭代器提供的方法来修改列表的结构。 3. 避免在迭代期间修改列表:避免在迭代 `resultList` 的同时修改列表的结构。可以先将 `resultList` 复制到一个新的列表,然后对新列表进行修改操作。 希望以上解释能够帮助你解决问题!如果还有其他疑问,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值