注意
1.拆分的list, 进行循环处理, 处理完, 使用list.clear(), 清空list里面的强引用对象, 让CG去回收失去引用的对象, 就能达到避免堆内存溢出的目的。
但是需要注意如果查询的时候, 一次性查出大约百万的数据, 在查询出来的时候, 已经把java内存撑爆了, 那么这个办法就不适用。
你应该优化的是MySQL的查询数据条数, 比如分页或加查询条件.
2.方法使用泛型, 支持自定义类型的入参
/**
* 将list拆分成指定数量的小list
* 注: 使用的subList方式,返回的是list的内部类,不可做元素的删除,修改,添加操作
* @param length 数量
* @param list 大list
*/
public List<List<T>> getSubList(int length, List<T> list){
int size = list.size();
int temp = size / length + 1;
boolean result = size % length == 0;
List<List<T>> subList = new ArrayList<>();
for (int i = 0; i < temp; i++) {
if (i == temp - 1) {
if (result) {
break;
}
subList.add(list.subList(length * i, size)) ;
} else {
subList.add(list.subList(length * i, length * (i + 1))) ;
}
}
return subList;
}
使用示例:
//每5000条数据, 拆成一个list
List<List<RepayEntityVo>> repayEntityVoList = fileUtils.getSubList(5000, repayEntityVos);