Java规范 慎用ArrayList中的subList
比较常见的两个问题
- 数组下标越界问题
- 转换异常问题
- 数组下标越界
常出现于截取,list分页的情况下,subList的长度大于原数组长度就会抛出数组下标越界,例如原list长度10,截取的时候(11,30)就会越界异常。
/**
* @author zrj
* @version V1.0
* @since 2020/11/23
**/
public class PageList {
public static void main(String[] args) {
List<Integer> list = new ArrayList( 10 );
for (int i = 0; i < 10; i++) {
list.add( i );
}
//Exception in thread "main" java.lang.IndexOutOfBoundsException: toIndex = 50
pageBySubList(list,5,10);
}
/**
* 利用subList方法进行分页
*
* @param list 分页数据
* @param pagesize 页面大小
* @param currentPage 当前页面
*/
public static List<String> pageBySubList(List list, int pagesize, int currentPage) {
int totalcount = list.size();
int pagecount = 0;
List<String> subList;
int m = totalcount % pagesize;
if (m > 0) {
pagecount = totalcount / pagesize + 1;
} else {
pagecount = totalcount / pagesize;
}
if (m == 0) {
subList = list.subList( (currentPage - 1) * pagesize, pagesize * (currentPage) );
} else {
if (currentPage == pagecount) {
subList = list.subList( (currentPage - 1) * pagesize, totalcount );
} else {
subList = list.subList( (currentPage - 1) * pagesize, pagesize * (currentPage) );
}
}
return subList;
}
}
- 转换异常
【强制】 ArrayList的subList结果不可强转成ArrayList,否则会抛出 ClassCastException异常, 即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList。
说明: subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList 而是 ArrayList的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。
如果需要对 subList 作出修改,又不想动原 list。那么可以创建 subList 的一个
拷贝:
subList = Lists.newArrayList(subList);
list.stream().skip(strart).limit(end).collect(Collectors.toList());