有的时候,如果我们需要将现有的List按照指定的大小(size)分成段到新的newList中,newList中的每个元素都是一个原有的List,原有的List中包含size个元素,见如下代码:
public class ListUtils {
/**
* 分割List
* @author bianrx
* @date 2012.1.13
* @param list 待分割的list
* @param pageSize 每段list的大小
* @return List<<List<T>>
*/
public static <T> List<List<T>> splitList(List<T> list, int pageSize) {
int listSize = list.size(); //list的大小
int page = (listSize + (pageSize-1))/ pageSize; //页数
List<List<T>> listArray = new ArrayList<List<T>>(); //创建list数组 ,用来保存分割后的list
for(int i=0;i<page;i++) { //按照数组大小遍历
List<T> subList = new ArrayList<T>(); //数组每一位放入一个分割后的list
for(int j=0;j<listSize;j++) { //遍历待分割的list
int pageIndex = ( (j + 1) + (pageSize-1) ) / pageSize; //当前记录的页码(第几页)
if(pageIndex == (i + 1)) { //当前记录的页码等于要放入的页码时
subList.add(list.get(j)); //放入list中的元素到分割后的list(subList)
}
if( (j + 1) == ((j + 1) * pageSize) ) { //当放满一页时退出当前循环
break;
}
}
listArray.add(subList); //将分割后的list放入对应的数组的位中
}
return listArray;
}
public static void main(String[] s) {
List<String> strlist = new ArrayList<String>();
for(int i=0;i<120;i++) {
strlist.add("aa" + (i+1));
}
List<List<String>> list = split2List(strlist, 17);
int index = 1;
for(List<String> strlist2: list) {
System.out.println(index++);
System.out.println("----------------------------------");
for(String str: strlist2) {
System.out.print(str + "\t");
}
System.out.println("END");
System.out.println();
}
}
}
以下是最新实现方式,效率有很大提升,已经测试通过,欢迎拍砖。
public static <T> List<List<T>> splitList(List<T> list, int pageSize) {
List<List<T>> listArray = new ArrayList<List<T>>();
List<T> subList = null;
for (int i = 0; i < list.size(); i++) {
if (i % pageSize == 0) {//每次到达页大小的边界就重新申请一个subList
subList = new ArrayList<T>();
listArray.add(subList);
}
subList.add(list.get(i));
}
return listArray;
}
相关推荐
在Java等编程语言中,通常会创建一个工具类来实现这个功能,该工具类会包含对数据进行分段、添加、修改、查询和删除的方法。 首先,我们需要理解分段的概念。分段通常是基于数据的某种标识,如ID,将数据划分为若干...
JDBC分段批量提交时出现异常的处理:可以通过设置合适的批处理大小和异常捕获处理。 JDBC批量处理数据:JDBC提供批量更新功能,可以一次性发送多个更新请求。 Oracle分页:Oracle提供了ROWNUM和ROWID进行分页查询...
- 使用`list.toArray()`将`List`转为数组。 #### ArrayList与LinkedList的区别 - **ArrayList**:基于数组实现,随机访问快,增删慢。 - **LinkedList**:基于链表实现,增删快,随机访问慢。 #### 多线程场景下...
Java集合框架是Java编程语言中不可或缺的部分,它提供了一种高效、灵活的数据组织方式。集合框架包括了多种接口和类,如List、Set、Map,它们各自有着独特的用途和实现方式。 1. List接口:List是有序的集合,允许...
- **Array与ArrayList**:`Array`用于存储固定大小的数组,`ArrayList`则用于存储可变大小的列表。 - **Comparable与Comparator**:`Comparable`接口用于定义对象自身的排序规则,`Comparator`接口用于定义外部的...
ConcurrentHashMap是Java并发编程中的线程安全HashMap,它通过分段锁机制实现了高效并发。 6. **如何在ArrayList中实现线程安全?** 可以使用Collections.synchronizedList()将ArrayList包装为线程安全的列表,...
当链表长度超过8,且数组大小超过64时,HashMap会将链表转化为红黑树。HashTable是线程安全的,内部实现与HashMap类似,但所有的公共方法都同步了,所以性能较低。ConcurrentHashMap是线程安全且高效的实现,它采用...
- **Collections.sort**:对于`List`的排序,`Collections.sort()` 方法内部实际上是基于归并排序的一个变种——TimSort。这种排序算法首先会检查列表是否已经部分有序,如果是,则直接利用这种有序性进行排序,这...
- **Java序列化和反序列化**:序列化是将对象转换为字节流以便持久化或传输,而反序列化则是相反过程。 - **Object类中常见的方法**:wait()、notify()等用于线程同步。 - **Java的平台无关性**:通过Java虚拟机...
代码中提到的`ListUtils.partition(list, batchSize)`是Apache Commons Collections提供的一个方法,它将列表分割成指定大小的子列表。这个功能也可以通过Java 8的Lambda表达式实现,但Apache Commons提供了更简单...
List<String> list = new ArrayList(1000000); ``` #### 16. Hashmap和 concurrentHashmap除了线程安全 还有什么区别,put的时候是怎么处理的。 - **HashMap**:非线程安全,效率较高。 - **ConcurrentHashMap**:...
2. String类是final的,不能被继承,因为String是Java中非常基础且重要的类,为了保证其安全性和性能,设计者将其设为不可继承。 3. String、StringBuffer和StringBuilder都是用来处理字符串的。String是不可变的,...
在Java服务器页面(JSP)中实现分页功能是一项常见的任务,特别是在开发Web应用程序时,尤其是在数据量较大的情况下,为了提高用户体验,需要将大量数据分段显示。分页不仅可以优化加载速度,还可以使得用户更容易...
`ConcurrentHashMap`是Java提供的一个支持高并发访问的哈希表实现,它使用了一种称为**分段锁**的技术来提高并发性能。具体来说: - 使用**哈希表**作为基本的数据结构。 - 使用**链表**或**红黑树**作为哈希表中每...
根据给定文件的信息,我们可以将知识点分为几个大类:Java基础知识、JVM相关知识、Spring框架、数据库技术、分布式系统及缓存管理等。接下来,我会逐一解析这些知识点。 ### Java基础知识 #### 1. HashCode与...
- **java.util**:提供了大量实用工具类,如集合框架(List、Map等)、日期操作等。 - **java.io**:提供用于输入/输出的类,如FileInputStream、OutputStreamWriter等。 - **java.sql**:为SQL数据库访问提供API...
- List是有序且可重复的集合,允许精确控制每个元素的插入位置,并能删除指定位置的元素。 - 常见的List实现包括ArrayList、LinkedList和已过时的Vector。 3. **HashMap** - HashMap是非同步的,允许null键值对...
该指令用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中,import指令的语法格式如下: 上面的代码将导入/lib/common.ftl模板文件中的所有变量,将这些变量放置在一个名为com的Map对象中. 创建...
2. **最大消息大小**: Kafka 可以接收的最大消息大小约为 1000000 字节,这允许处理大量数据。 3. **副本不在 ISR 中的意义**: ISR (In-Sync Replicas) 是一组与领导者保持同步的副本。如果副本不在 ISR 中,表示它...
- **高度自定义**: 支持自定义每个分段的颜色、大小、文本等属性,可以根据需求定制出各种样式。 - **交互性强**: 用户可以触摸屏幕旋转轮盘,支持滑动和点击事件,提供良好的用户体验。 - **平滑动画**: 内置平滑...