Java提高篇(三五)-----Java集合细节(一):请为集合指定初始容量
集合是我们在Java编程中使用非常广泛的,它就像大海,海纳百川,像万能容器,盛装万物,而且这个大海,万能容器还可以无限变大(如果条件允许)。当这个海、容器的量变得非常大的时候,它的初始容量就会显得很重要了,因为挖海、扩容是需要消耗大量的人力物力财力的。同样的道理,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));
</span><span style="color: #0000ff">long</span> begin2 =<span style="color: #000000"> System.currentTimeMillis();
List</span><StudentVO> list2 = <span style="color: #0000ff">new</span> ArrayList<>(1000000<span style="color: #000000">);
</span><span style="color: #0000ff">for</span>(<span style="color: #0000ff">int</span> i = 0 ; i < 1000000; i++<span style="color: #000000">){
student </span>= <span style="color: #0000ff">new</span> StudentVO(i,"chenssy_"+<span style="color: #000000">i,i);
list2.add(student);
}
</span><span style="color: #0000ff">long</span> end2 =<span style="color: #000000"> System.currentTimeMillis();
System.out.println(</span>"list2 time:" + (end2 -<span style="color: #000000"> begin2));
}</span></pre>
上面代码两个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;
}
</span><span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> ensureCapacity(<span style="color: #0000ff">int</span><span style="color: #000000"> minCapacity) {
modCount</span>++; <span style="color: #008000">//</span><span style="color: #008000">修改计数器</span>
<span style="color: #0000ff">int</span> oldCapacity =<span style="color: #000000"> elementData.length;
</span><span style="color: #008000">//</span><span style="color: #008000">当前需要的长度超过了数组长度,进行扩容处理</span>
<span style="color: #0000ff">if</span> (minCapacity ><span style="color: #000000"> oldCapacity) {
Object oldData[] </span>=<span style="color: #000000"> elementData;
</span><span style="color: #008000">//</span><span style="color: #008000">新的容量 = 旧容量 * 1.5 + 1</span>
<span style="color: #0000ff">int</span> newCapacity = (oldCapacity * 3)/2 + 1<span style="color: #000000">;
</span><span style="color: #0000ff">if</span> (newCapacity <<span style="color: #000000"> minCapacity)
newCapacity </span>=<span style="color: #000000"> minCapacity;
</span><span style="color: #008000">//</span><span style="color: #008000">数组拷贝,生成新的数组 </span>
elementData =<span style="color: #000000"> Arrays.copyOf(elementData, newCapacity);
}
}</span></pre>
ArrayList每次新增一个元素,就会检测ArrayList的当前容量是否已经到达临界点,如果到达临界点则会扩容1.5倍。然而ArrayList的扩容以及数组的拷贝生成新的数组是相当耗资源的。所以若我们事先已知集合的使用场景,知道集合的大概范围,我们最好是指定初始化容量,这样对资源的利用会更加好,尤其是大数据量的前提下,效率的提升和资源的利用会显得更加具有优势。
java集合细节一:请为集合指定初始容量
-----原文出自:http://cmsblogs.com/?p=1226,请尊重作者辛勤劳动成果,转载说明出处.
-----个人站点:http://cmsblogs.com
Java提高篇(三五)-----Java集合细节(一):请为集合指定初始容量的更多相关文章
- java提高篇-----理解java的三大特性之封装
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- java提高篇(三)-----java的四舍五入
Java小事非小事!!!!!!!!!!!! 四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了.在讲解之间我们先看如下一个经典的案例: public stat ...
- java提高篇(四)-----理解java的三大特性之多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- java提高篇(三)-----理解java的三大特性之多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- (转)java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- 【转】java提高篇(二)-----理解java的三大特性之继承
[转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...
- Java提高篇(三二)-----List总结
前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...
随机推荐
- hibernate常用关联
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns=" ...
- cookie session URL重写 与考试
状态管理.Cookie.Session.URL重写 HTTP协议:无状态的连接(每次连接都是新的请求)1.隐藏字段 <input type="hidden" name=&qu ...
- [16]APUE:套接字
[a] socket / socketpair #include <sys/socket.h> int socket(int domain, int type, int protocol) ...
- JiaThis分享插件的使用
jia This的下载地址:http://www.jiathis.com/ 只需要在页面上加上以下代码即可 <span class="jiathis_style"> & ...
- 添加Properties取值和枚举取值
<!--配置文件--><property name="ppp"> <props> <prop key="11"> ...
- win7环境下安装运行gotour【转载整理】
转载请注明出处:http://www.cnblogs.com/Vulpers/p/5562586.html 最近尝试学习golang,在某个网站(真忘了)上发现gotour是一款灰常叼的教程& ...
- 【IOS】Xcode7以上免证书真机调试
Xcode7之前,想要真机调试,必须花99刀购买开发者账号,而且步骤繁琐,需要下载证书.随着Xcode7的推出,大幅度的简化了真机调试的步骤,对ios开发工作者和正在学习ios开发的众多码农们,可以说 ...
- (python)对象的引用
对比下列两个例子: 例子1: a=10 b=a a=a+2 print "a=",a,"b=",b 结果:a= 12 b= 10 a+2后,b仍然是10 例子2 ...
- css3之多列
- 解决ORA-00824: cannot set sga_target due to existing
今天Linux服务器机子重启了下,Oracle启动不起来,提示:解决ORA-00824: cannot set sga_target due to existing 看了很多解决方法,发现下面这个特别 ...