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. Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次 ...

  2. create_module - 生成一条可加载模块记录

    总览 #include <linux/module.h> caddr_t create_module(const char *name, size_t size); 描述 create_m ...

  3. bzip2 一种块排序文件压缩软件

    总览 bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ... ] bunzip2 [ -fkvsVL ] [ filenames ... ] bzcat [ - ...

  4. 【经验】停止Smart Card服务

    Windows+R键调出运行 输入 services.msc 有一项Smart Card的服务找到他->属性->启动类型(设置为禁用 )->确定,然后重新启动服务

  5. 指定PHP编码

    有时候我们写好的PHP页面在网页中打开是乱码的,就需要指定编码,即加入代码: header("content-type:text/html;charset=utf-8"); 位置图 ...

  6. [Python3网络爬虫开发实战] 1.5.3-redis-py的安装

    对于Redis来说,我们要使用redis-py库来与其交互,这里就来介绍一下它的安装方法. 1. 相关链接 GitHub:https://github.com/andymccurdy/redis-py ...

  7. PHP实现定时任务的几种方式

    关于定时任务,之前以前认识了一种最常用的:crontab定时任务.通过linux的定时任务去实现.今天又认识了一下php实现定时方式的其它方式,总结一下. 一 服务器定时任务 服务器定时任务,其实就是 ...

  8. js 技巧 (七)JS代码判断集锦(之一)

    JS代码判断集锦(之一) ~~~~~~~~~~~~~~~~~~ <script language="JavaScript"> function checkid(iden ...

  9. 23Spring使用JdbcTemplate和JdbcDaoSupport

    首先需要添加c3p0包和jdbc包 数据库: CREATE DATABASE IF NOT EXISTS `spring` /*!40100 DEFAULT CHARACTER SET utf8 */ ...

  10. Python之数字

    Python之数字 int(数字)===>在Python3中,int没有范围,在Python2中,int超出范围就叫长整型(Long). 浮点运算:单精度 float 双精度 double a: ...