java List数组根据给定大小分割数组

简介: 在获取到很长的数组时,一次性处理数据量太大,需要分批处理,这就需要分批处理了。1、使用List的subList,封装方法2、google工具类型Lists的partition经测试个人推荐使用第一种方法,效率上快了10几倍,估计是因为没有重新生成数组的原因

直接上代码:
1、使用List的subList,封装方法
第一个方法是针对Integer的List
第二个方法是适合所有对象的,经测试第二个方法给第一个方法快很多,好像不用时间一样。

/*****
     * 
     * @param dataList
     * @return 如果输入的数据列表为空,则返回一个空的数组。如果传分割的大小小于或者等于0,则会将传的数组放在数组第一个元素返回
     */
    public static List<List<Integer>> myListPartition(List<Integer> dataList,int splitSize){
   
        if(dataList == null || dataList.isEmpty()) {
   
            return new ArrayList<>();
        }
        List<List<Integer>> resList = new ArrayList<>();
        if(splitSize <= 0) {
   
            resList.add(dataList);
            return resList;
        }
        int dataSize = dataList.size();
        for(int i=0;i<dataSize;i += splitSize) {
   
            int end = Math.min(i + splitSize, dataSize);
            resList.add(dataList.subList(i, end));
        }
        return resList;
    }
    /***
     * 
     * @param dataList
     * @param splitSize
     * @return 跟上面的方法一样,这里写一个通用类型的
     */
    public static <T> List<List<T>> myListPartitionFormat(List<T> dataList,int splitSize){
   
        if(dataList == null || dataList.isEmpty()) {
   
            return new ArrayList<>();
        }
        List<List<T>> resList = new ArrayList<>();
        if(splitSize <= 0) {
   
            resList.add(dataList);
            return resList;
        }
        int dataSize = dataList.size();
        for(int i=0;i<dataSize;i += splitSize) {
   
            int end = Math.min(i + splitSize, dataSize);
            resList.add(dataList.subList(i, end));
        }
        return resList;
    }

二、google工具类型Lists的partition
先导入架包

     <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>21.0</version>
    </dependency>

使用:

import com.google.common.collect.Lists;
List<List<Integer>> resList1 = Lists.partition(testList, 33);

测试结果:
1万条数据:
//Integer
Time : 2.0
Size : 3031
//google
Time : 39.0
Size : 3031
//T
Time : 1.0
Size : 3031

相关文章
|
11天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
39 5
|
9天前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
15 3
|
11天前
|
存储 缓存 算法
Java 数组
【10月更文挑战第19天】Java 数组是一种非常实用的数据结构,它为我们提供了一种简单而有效的方式来存储和管理数据。通过合理地使用数组,我们能够提高程序的运行效率和代码的可读性。更加深入地了解和掌握 Java 数组的特性和应用,为我们的编程之旅增添更多的精彩。
26 4
|
9天前
|
Java 程序员
Java|List.subList 踩坑小记
不应该仅凭印象和猜测,就开始使用一个方法,至少花一分钟认真读完它的官方注释文档。
13 1
|
11天前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
14 2
|
19天前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
|
25天前
|
Java
Java数组动态扩容和动态缩减
Java数组动态扩容和动态缩减
18 3
|
19天前
|
存储 算法 Java
带你学习java的数组军队列
带你学习java的数组军队列
31 0
|
8天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
79 38
|
5天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?