list.ensureCapacity竟然会变慢

jdk1.8

应该是做了优化了;

public class Test10 {

    public static void main(String[] args) {

        ArrayList<Integer> list = new ArrayList<>();
long beginTime = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE / 300; i++) {
list.add(i);
}
long endTime = System.currentTimeMillis();
CusPrint.print(endTime - beginTime); //
} } public class Test11 { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>();
// ArrayList<Integer> list = new ArrayList<>(Integer.MAX_VALUE/300); // 这样也挺慢的
CusPrint.print("---");
list.ensureCapacity(Integer.MAX_VALUE/300); // 这样竟然比不加这句要慢
CusPrint.print("---");
long beginTime = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE / 300; i++) {
list.add(i);
}
long endTime = System.currentTimeMillis();
CusPrint.print(endTime - beginTime); //
} }

测了一下还是数组快:

        beginTime2 = System.currentTimeMillis();
int [] arr1 = new int[Integer.MAX_VALUE/300];
for(int i=0;i<Integer.MAX_VALUE/300;i++) {
arr1[i] = i;
}
endTime2 = System.currentTimeMillis();
CusPrint.print(endTime2 - beginTime2); //

放到一起,修改一下list的最大容量,数组就是快,使用了ensureCapacity就是慢;

public class Test11_2 {

    public static void main(String[] args) {

        ArrayList<Integer> list = new ArrayList<>();
CusPrint.print("---");
int capacity = Integer.MAX_VALUE/30;
list.ensureCapacity(capacity); // 这样竟然比不加这句要慢
CusPrint.print("---");
long beginTime = System.currentTimeMillis();
for (int i = 0; i < capacity; i++) {
list.add(i);
}
long endTime = System.currentTimeMillis();
CusPrint.print(endTime - beginTime); //
CusPrint.print("---------------");
ArrayList<Integer> list2 = new ArrayList<>();
long beginTime2 = System.currentTimeMillis();
for (int i = 0; i < capacity; i++) {
list2.add(i);
}
long endTime2 = System.currentTimeMillis();
CusPrint.print(endTime2 - beginTime2); //
CusPrint.print("---------------");
for(int i=0;i<capacity;i++) {
if(i<capacity) { }
}
CusPrint.print("---------------");
for(int i=0;i<capacity;i++) {
if(i<i+1) { }
}
CusPrint.print("---------------");
beginTime2 = System.currentTimeMillis();
int [] arr1 = new int[capacity];
for(int i=0;i<capacity;i++) {
arr1[i] = i;
}
endTime2 = System.currentTimeMillis();
CusPrint.print(endTime2 - beginTime2); //
CusPrint.print("---------------"); } }

改到Integer.MAX_VALUE/3;直接就OOM了;

list.ensureCapacity(capacity);  // 就是这句就可以OOM

异常:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3210)
at java.util.Arrays.copyOf(Arrays.java:3181)
at java.util.ArrayList.grow(ArrayList.java:265)
at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
at java.util.ArrayList.ensureCapacity(ArrayList.java:219)
at com.stono.thread3.page_arraylist.Test11_2.main(Test11_2.java:14)

你在凝望深渊的时候,深渊也在凝望你,别看太久。

哈哈,再看会儿:

使用list.trimToSize();竟然可以变快;

public class Test30 {

    public static void main(String[] args) {

        ArrayList list = new ArrayList();
list.ensureCapacity(Integer.MAX_VALUE / 300);
list.trimToSize();
long beginTime = System.currentTimeMillis();
for (int i = 0; i < Integer.MAX_VALUE / 300; i++) {
list.add(i);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime - beginTime);
}
}

list.ensureCapacity竟然会变慢的更多相关文章

  1. JavaScript很牛

    几年前,我从来没有想过现在的JavaScript竟然会变得几乎无处不在.下面是几个要关注JavaScript的原因. 首先,我认为JavaScript能够得到普及的主要原因之一是,JavaScript ...

  2. css+div如何解决文字溢出

    看到标题你一定很轻易就会想到截断文字加“...”的做法.哈哈,就是这样.其实写这篇日志也只是把这样方法做个记录,因为似乎还有很多人不记得碰到这样的情况该如何处理. 首先,先解释一下,一般用div+cs ...

  3. 转自知乎,亲民好酒推荐 分类: fool_tree的笔记本 2014-11-08 17:37 652人阅读 评论(0) 收藏

    这里尽量为大家推荐一些符合大众喜好.业内公认好评."即使你不喜欢,你也会承认它不错"的酒款.而且介绍到的酒款还会有一个共同的特征,就是能让你方便的在网上买到. 大概会分为烈酒,利口 ...

  4. 修改 iOS AppIcon

    有一次看到亚马逊的客户端打开后,就提示 icon 改变了,回桌面一看,竟然真的变了.然后就上网搜索是怎么实现的,参照着写了一个小 demo ,权当笔记. 首先,导入图片到项目的中,如下图.不要导入到 ...

  5. 一口气带你踩完五个 List 的大坑,真的是处处坑啊!

    List 可谓是我们经常使用的集合类之一,几乎所有业务代码都离不开 List.既然天天在用,那就没准就会踩中这几个 List 常见坑. 今天我们就来总结这些常见的坑在哪里,捞自己一手,防止后续同学再继 ...

  6. 史上巨坑: vim的"set foldmethod=syntax"设置竟然是导致ctrl+p(ctrl+n)补全在文件稍大时光标位于中间位置补全效率变慢的元凶!

    最近我的vim又让我闹心了. 问题出现在supertab的补全速度上, 有时候按下tab键半天才弹出补全列表, 即便是弹出了列表在列表上下移动也变得的相当缓慢, 这让我的很是蛋疼. 在完全无法接受这个 ...

  7. 变得“不正经”的CES,竟然越来越好玩了

    在所有科技界的展会中,国人最熟悉的当属CES.作为科技行业的风向指示标,CES一直在扮演着重要的潮流指引者角色.不过,现在的CES似乎变得越来越"不正经"了!原本CES是国际消费类 ...

  8. 拥抱ARM妹纸第二季 之 第三次 给我变个月亮,让约会更浪漫!

    嗯嗯,效果不错.趁着这个热乎劲,接到俺的LED测试板上试试.呃~~~ 竟然和小LED的效果不一样啊,不一样.不但闪烁而且完全没有调光效果.郁闷内,查查原因呗.看看那里出问题.迅速在PT4115手册里翻 ...

  9. [改善Java代码]覆写变长方法也循规蹈矩

    建议6:覆写变长方法也循规蹈矩 在Java中,子类覆写父类中的方法很常见,这样做既可以修正Bug也可以提供扩展的业务功能支持,同时还符合开闭原则(Open-Closed Principle),我们来看 ...

随机推荐

  1. ASP.NET Excel下载方法一览

    方法一 通过GridView(简评:方法比较简单,但是只适合生成格式简单的Excel,且无法保留VBA代码),页面无刷新 aspx.cs部分 using System; using System.Co ...

  2. jquery /css3 全屏的渐变背景

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Google Chrome浏览器调试

    作为Web开发人员,我为什么喜欢Google Chrome浏览器 [原文地址:http://www.cnblogs.com/QLeelulu/archive/2011/08/28/2156402.ht ...

  4. linux远程开机

    它需要wakeonlan这个软件,     从何处得到它?     它的官方站是:http://sourceforge.net/projects/wake-on-lan/     如果使用rpm包可以 ...

  5. CentOS7.4 搭建和使用telnet

    1.先检查是否安装了telnet rpm -qa | grep telnet  //检查你的CentOS是否安装了telnet和telnet-server rpm -qa xinetd //检查你的C ...

  6. http2提升效率的几个点

    1.二进制传输,消息的解析效率更高 2.头部数据压缩,传输效率更高 3.多路复用,可以让请求并发执行 4.服务器推送,可以主动推送数据到浏览器 http2加载图片demo:https://http2. ...

  7. Data of Ch5 --Dual rotor

    * Results *Conclusion*- little effect of rear rotor on Cp_1- Cp1 is independent of TI** TI effect on ...

  8. Poj 2187 凸包模板求解

    Poj 2187 凸包模板求解 传送门 由于整个点数是50000,而求凸包后的点也不会很多,因此直接套凸包之后两重循环即可求解 #include <queue> #include < ...

  9. DAG模型(矩形嵌套)

    推荐在线例题:http://acm.nyist.net/JudgeOnline/problem.php?pid=16 题摘: 矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难 ...

  10. hadoop_exporter

    1.下载安装go 1.下载二进制包:go1.4.linux-amd64.tar.gz. 2.将下载的二进制包解压至 /usr/local目录. tar -C /usr/local -xzf go1.4 ...