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. 在Eclipse中用Maven打包jar包--完整版

    将本地的jar导入到maven本地库中 <!--手动加入库中 --><!-- mvn install:install-file -DgroupId=org.apache.Hadoop ...

  2. (转)淘淘商城系列——maven工程debug调试

    http://blog.csdn.net/yerenyuan_pku/article/details/72784074 上文我们已经实现了商品列表展示的功能,在实际开发中我们肯定是要经常对maven工 ...

  3. python爬虫学习:分布式抓取

    前面的文章都是基于在单机操作,正常情况下,一台机器无论配置多么高,线程开得再多,也总会有一个上限,或者说成本过于巨大.因此,本文将提及分布式的爬虫,让爬虫的效率提高得更快. 构建分布式爬虫首先需要有多 ...

  4. java关于时间的相关操作

    /** * 获取当天时间零点 * @return */ public Date gettoday(){ SimpleDateFormat sdf = new SimpleDateFormat(&quo ...

  5. redis(以php代码为例)

    备注:redis及phpredis扩展安装请查看:PHP典型功能与Laravel5框架开发学习笔记 redis具有原子性,所以在高并发情况下确保数据的一致性 一.连接 $redis = new Red ...

  6. MySQL主从配置详解

    一.mysql主从原理 1. 基本介绍 MySQL 内建的复制功能是构建大型,高性能应用程序的基础.将 MySQL 的 数亿分布到到多个系统上去,这种分步的机制,是通过将 MySQL 的某一台主机的数 ...

  7. django找不到报错 ‘zsh: command not found: django-admin.py’

    >>python -m django --version >> 1.11.4 说明django安装成功,但是django-admin 报错 ‘zsh: command not ...

  8. Python爬虫入门教程: All IT eBooks多线程爬取

    All IT eBooks多线程爬取-写在前面 对一个爬虫爱好者来说,或多或少都有这么一点点的收集癖 ~ 发现好的图片,发现好的书籍,发现各种能存放在电脑上的东西,都喜欢把它批量的爬取下来. 然后放着 ...

  9. gcc 编译多个源文件

    序 Linux 内核和许多其他自由软件以及开放源码应用程序都是用 C 语言编写并使用 GCC 编译的. 编译C++程序 编译.链接命令 -c 只编译不里链接 -o链接 例: g++ file1 -c ...

  10. Final Battle #1 K题 Fire game

    Description Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows ...