将集合中的数据按照指定长度进行分片
Posted TGB-Earnest
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将集合中的数据按照指定长度进行分片相关的知识,希望对你有一定的参考价值。
需求
最近在做需求的时候,在写定时任务获取数据进行业务操作,但是又不能获取太多操作库,所以需要进行分片处理。
代码
方式一:
List<Integer> listTotal = new ArrayList<>();
for (int i = 0; i < 10086; i++)
listTotal.add(i);
System.out.println("---------------------开始---------------------");
long start = System.currentTimeMillis();
int toIndex=1000;
Map<String,List<Integer>> listMap = new HashMap<>();
int count =0;
for (int i = 0; i < listTotal.size(); i+=1000)
if (i+1000> listTotal.size())
toIndex = listTotal.size()-i;
List<Integer> list = listTotal.subList(i, i+toIndex);
String key="list"+count;
listMap.put(key,list);
count++;
long end = System.currentTimeMillis();
System.out.println("所用时间为: %d 毫秒>"+(end-start));
System.out.println("---------------------结束---------------------");
所用时间为:
---------------------开始---------------------
所用时间为: %d 毫秒>0
---------------------结束---------------------
方式二
System.out.println("-------------------ListUtil.partition开始----------------");
long start1 = System.currentTimeMillis();
List<List<Integer>> partition = ListUtil.partition(listTotal, 1000);
long end1 = System.currentTimeMillis();
System.out.println("所用时间为: %d 毫秒>"+(end1-start1));
System.out.println("-------------------ListUtil.partition结束----------------");
所用时间为
-------------------ListUtil.partition开始----------------
所用时间为: %d 毫秒>72863
-------------------ListUtil.partition结束----------------
结论
通过对比可以发现虽然自己写的代码长,但是效率可能更高一点。
然后我们解析partition中的源代码
public static <T> List<List<T>> partition(List<T> list, int size)
if (CollUtil.isEmpty(list))
return empty();
else
return (List)(list instanceof RandomAccess ? new RandomAccessPartition(list, size) : new Partition(list, size));
发现里面还有生成对象的操作
public Partition(List<T> list, int size)
this.list = list;
this.size = Math.min(size, list.size());
public List<T> get(int index)
int start = index * this.size;
int end = Math.min(start + this.size, this.list.size());
return this.list.subList(start, end);
public int size()
int size = this.size;
int total = this.list.size();
int length = total / size;
if (total % size > 0)
++length;
return length;
里面最后get的时候也是使用了list.subList方法
以上是关于将集合中的数据按照指定长度进行分片的主要内容,如果未能解决你的问题,请参考以下文章