Java中间(三十五)-----Java详细设置(一个):请指定初始容量设置
2015-07-08 10:59
585 查看
集合是我们在Java编程中使用很广泛的,它就像大海,海纳百川,像万能容器,盛装万物。并且这个大海,万能容器还能够无限变大(假设条件同意)。
当这个海、容器的量变得很大的时候,它的初始容量就会显得很重要了,由于挖海、扩容是须要消耗大量的人力物力財力的。相同的道理。Collection的初始容量也显得异常重要。
所以:对于已知的情景。请为集合指定初始容量。
上面代码两个list都是插入1000000条数据,仅仅只是list1没有没有申请初始化容量。而list2初始化容量1000000。那执行结果例如以下:
从上面的执行结果我们能够看出list2的速度是list1的两倍左右。
在前面LZ就提过,ArrayList的扩容机制是比較消耗资源的。
我们先看ArrayList的add方法:
ArrayList每次新增一个元素。就会检測ArrayList的当前容量是否已经到达临界点,假设到达临界点则会扩容1.5倍。
然而ArrayList的扩容以及数组的拷贝生成新的数组是相当耗资源的。
所以若我们事先已知集合的使用场景,知道集合的大概范围,我们最好是指定初始化容量,这样对资源的利用会更加好,尤其是大数据量的前提下。效率的提升和资源的利用会显得更加具有优势。
>>>>>>java集合细节一:请为集合指定初始容量
-----原文出自:p=1233" href="http://cmsblogs.com/?
p=1233" style="margin: 0px; padding: 0px; text-decoration: none; color: rgb(0, 0, 0); border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: rgb(51, 51, 51);">http://cmsblogs.com/?p=1233,请尊重作者辛勤劳动成果,转载说明出处.
-----个人网站:http://cmsblogs.com
当这个海、容器的量变得很大的时候,它的初始容量就会显得很重要了,由于挖海、扩容是须要消耗大量的人力物力財力的。相同的道理。Collection的初始容量也显得异常重要。
所以:对于已知的情景。请为集合指定初始容量。
public static void main(String[] args) { StudentVO student = null; long begin1 = System.currentTimeMillis(); List<StudentVO> list1 = new ArrayList<>(); for(int i = 0 ; i < 1000000; i++){ student = new StudentVO(i,"chenssy_"+i,i); list1.add(student); } long end1 = System.currentTimeMillis(); System.out.println("list1 time:" + (end1 - begin1)); long begin2 = System.currentTimeMillis(); List<StudentVO> list2 = new ArrayList<>(1000000); for(int i = 0 ; i < 1000000; i++){ student = new StudentVO(i,"chenssy_"+i,i); list2.add(student); } long end2 = System.currentTimeMillis(); System.out.println("list2 time:" + (end2 - begin2)); }
上面代码两个list都是插入1000000条数据,仅仅只是list1没有没有申请初始化容量。而list2初始化容量1000000。那执行结果例如以下:
list1 time:1638 list2 time:921
从上面的执行结果我们能够看出list2的速度是list1的两倍左右。
在前面LZ就提过,ArrayList的扩容机制是比較消耗资源的。
我们先看ArrayList的add方法:
public boolean add(E e) { ensureCapacity(size + 1); elementData[size++] = e; return true; } public void ensureCapacity(int minCapacity) { modCount++; //改动计数器 int oldCapacity = elementData.length; //当前须要的长度超过了数组长度。进行扩容处理 if (minCapacity > oldCapacity) { Object oldData[] = elementData; //新的容量 = 旧容量 * 1.5 + 1 int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; //数组拷贝,生成新的数组 elementData = Arrays.copyOf(elementData, newCapacity); } }
ArrayList每次新增一个元素。就会检測ArrayList的当前容量是否已经到达临界点,假设到达临界点则会扩容1.5倍。
然而ArrayList的扩容以及数组的拷贝生成新的数组是相当耗资源的。
所以若我们事先已知集合的使用场景,知道集合的大概范围,我们最好是指定初始化容量,这样对资源的利用会更加好,尤其是大数据量的前提下。效率的提升和资源的利用会显得更加具有优势。
>>>>>>java集合细节一:请为集合指定初始容量
-----原文出自:p=1233" href="http://cmsblogs.com/?
p=1233" style="margin: 0px; padding: 0px; text-decoration: none; color: rgb(0, 0, 0); border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: rgb(51, 51, 51);">http://cmsblogs.com/?p=1233,请尊重作者辛勤劳动成果,转载说明出处.
-----个人网站:http://cmsblogs.com
相关文章推荐
- plupload+struts2实现文件上传下载
- voltdb在eclipse运行测试用例失败
- myeclipse 配置 weblogic10
- 关于Java获取子方法的新建实例引用的心得
- java包及其使用
- JavaWeb学习笔记--跳转方法小结
- java新特性
- Spring面试题
- java web项目用cookie记住用户名、密码
- java使用默认线程池踩过的坑(三)
- java使用默认线程池踩过的坑(三)
- java中判断从数据库中取出的字段是否为空
- java使用默认线程池踩过的坑(二)
- Java注释@interface的用法【转】
- Java float保留两位小数或多位小数
- Java每日学习笔记1
- JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载
- Java I/O 操作及优化建议
- java的一些总结(不定期更新)
- java 泛型