将集合中的数据按照指定长度进行分片

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方法

以上是关于将集合中的数据按照指定长度进行分片的主要内容,如果未能解决你的问题,请参考以下文章

将集合中的数据按照指定长度进行分片

JAVA常用集合解析

DBMS提纲

IP 分片/MTU 与TCP分段/MSS

MongoDB集群设置集合分片生效

Redis中的Sharding分片机制