集合是我们在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>&lt;StudentVO&gt; list2 = <span style="color: #0000ff">new</span> ArrayList&lt;&gt;(1000000<span style="color: #000000">);
</span><span style="color: #0000ff">for</span>(<span style="color: #0000ff">int</span> i = 0 ; i &lt; 1000000; i++<span style="color: #000000">){
student </span>= <span style="color: #0000ff">new</span> StudentVO(i,&quot;chenssy_&quot;+<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>&quot;list2 time:&quot; + (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 &gt;<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 &lt;<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集合细节(一):请为集合指定初始容量的更多相关文章

  1. java提高篇-----理解java的三大特性之封装

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  2. java提高篇(三)-----java的四舍五入

    Java小事非小事!!!!!!!!!!!! 四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了.在讲解之间我们先看如下一个经典的案例: public stat ...

  3. java提高篇(四)-----理解java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  4. java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  5. java提高篇(三)-----理解java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  6. java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  7. (转)java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  8. 【转】java提高篇(二)-----理解java的三大特性之继承

    [转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...

  9. Java提高篇(三二)-----List总结

    前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...

随机推荐

  1. hibernate常用关联

    <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns=" ...

  2. cookie session URL重写 与考试

    状态管理.Cookie.Session.URL重写 HTTP协议:无状态的连接(每次连接都是新的请求)1.隐藏字段 <input type="hidden" name=&qu ...

  3. [16]APUE:套接字

    [a] socket / socketpair #include <sys/socket.h> int socket(int domain, int type, int protocol) ...

  4. JiaThis分享插件的使用

    jia This的下载地址:http://www.jiathis.com/ 只需要在页面上加上以下代码即可 <span class="jiathis_style"> & ...

  5. 添加Properties取值和枚举取值

    <!--配置文件--><property name="ppp"> <props> <prop key="11"> ...

  6. win7环境下安装运行gotour【转载整理】

    转载请注明出处:http://www.cnblogs.com/Vulpers/p/5562586.html 最近尝试学习golang,在某个网站(真忘了)上发现gotour是一款灰常叼的教程& ...

  7. 【IOS】Xcode7以上免证书真机调试

    Xcode7之前,想要真机调试,必须花99刀购买开发者账号,而且步骤繁琐,需要下载证书.随着Xcode7的推出,大幅度的简化了真机调试的步骤,对ios开发工作者和正在学习ios开发的众多码农们,可以说 ...

  8. (python)对象的引用

    对比下列两个例子: 例子1: a=10 b=a a=a+2 print "a=",a,"b=",b 结果:a= 12 b= 10 a+2后,b仍然是10 例子2 ...

  9. css3之多列

                                             

  10. 解决ORA-00824: cannot set sga_target due to existing

    今天Linux服务器机子重启了下,Oracle启动不起来,提示:解决ORA-00824: cannot set sga_target due to existing 看了很多解决方法,发现下面这个特别 ...