list.ensureCapacity竟然会变慢
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竟然会变慢的更多相关文章
- JavaScript很牛
几年前,我从来没有想过现在的JavaScript竟然会变得几乎无处不在.下面是几个要关注JavaScript的原因. 首先,我认为JavaScript能够得到普及的主要原因之一是,JavaScript ...
- css+div如何解决文字溢出
看到标题你一定很轻易就会想到截断文字加“...”的做法.哈哈,就是这样.其实写这篇日志也只是把这样方法做个记录,因为似乎还有很多人不记得碰到这样的情况该如何处理. 首先,先解释一下,一般用div+cs ...
- 转自知乎,亲民好酒推荐 分类: fool_tree的笔记本 2014-11-08 17:37 652人阅读 评论(0) 收藏
这里尽量为大家推荐一些符合大众喜好.业内公认好评."即使你不喜欢,你也会承认它不错"的酒款.而且介绍到的酒款还会有一个共同的特征,就是能让你方便的在网上买到. 大概会分为烈酒,利口 ...
- 修改 iOS AppIcon
有一次看到亚马逊的客户端打开后,就提示 icon 改变了,回桌面一看,竟然真的变了.然后就上网搜索是怎么实现的,参照着写了一个小 demo ,权当笔记. 首先,导入图片到项目的中,如下图.不要导入到 ...
- 一口气带你踩完五个 List 的大坑,真的是处处坑啊!
List 可谓是我们经常使用的集合类之一,几乎所有业务代码都离不开 List.既然天天在用,那就没准就会踩中这几个 List 常见坑. 今天我们就来总结这些常见的坑在哪里,捞自己一手,防止后续同学再继 ...
- 史上巨坑: vim的"set foldmethod=syntax"设置竟然是导致ctrl+p(ctrl+n)补全在文件稍大时光标位于中间位置补全效率变慢的元凶!
最近我的vim又让我闹心了. 问题出现在supertab的补全速度上, 有时候按下tab键半天才弹出补全列表, 即便是弹出了列表在列表上下移动也变得的相当缓慢, 这让我的很是蛋疼. 在完全无法接受这个 ...
- 变得“不正经”的CES,竟然越来越好玩了
在所有科技界的展会中,国人最熟悉的当属CES.作为科技行业的风向指示标,CES一直在扮演着重要的潮流指引者角色.不过,现在的CES似乎变得越来越"不正经"了!原本CES是国际消费类 ...
- 拥抱ARM妹纸第二季 之 第三次 给我变个月亮,让约会更浪漫!
嗯嗯,效果不错.趁着这个热乎劲,接到俺的LED测试板上试试.呃~~~ 竟然和小LED的效果不一样啊,不一样.不但闪烁而且完全没有调光效果.郁闷内,查查原因呗.看看那里出问题.迅速在PT4115手册里翻 ...
- [改善Java代码]覆写变长方法也循规蹈矩
建议6:覆写变长方法也循规蹈矩 在Java中,子类覆写父类中的方法很常见,这样做既可以修正Bug也可以提供扩展的业务功能支持,同时还符合开闭原则(Open-Closed Principle),我们来看 ...
随机推荐
- [Windows Server 2008] 阿里云.云主机忘记密码解决方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:解决阿里云 ...
- codeforces_C. Sequence Transformation
http://codeforces.com/contest/1059/problem/C 题意: 最初给一个1.2.3.…….n的序列,每次操作先将所有元素的最大公约数加入答案序列,然后在序列中任意删 ...
- 【git】搭建git服务器
在 Linux 下搭建 Git 服务器 目录 ① 安装 Git ② 服务器端创建 git 用户,用来管理 Git 服务,并为 git 用户设置密码 ③ 服务器端创建 Git 仓库 ④ 客户端 clon ...
- Vim中文编码问题
1.影响中文编码的设置项 encoding(enc):encoding是Vim的内部使用编码,encoding的设置会影响Vim内部的Buffer.消息文字等.在 Unix环境下,encoding的默 ...
- AttributeError: 'dict' object has no attribute 'encode'
首先这是一个很简单的 运行时错误: 错误分析: AttributeError:属性错误,造成这种错误的原因可能有: 你尝试访问一个不存在的属性或方法.检查一下拼写!你可以使用内建函数 dir 来列出存 ...
- Codeforces Round #569 题解
Codeforces Round #569 题解 CF1179A Valeriy and Deque 有一个双端队列,每次取队首两个值,将较小值移动到队尾,较大值位置不变.多组询问求第\(m\)次操作 ...
- 第2节 mapreduce深入学习:12、reducetask运行机制(多看几遍)
ReduceTask的运行的整个过程 背下来1.启动线程到mapTask那里去拷贝数据,拉取属于每一个reducetask自己内部的数据2.数据的合并,拉取过来的数据进行合并,合并的过程,有可能在内存 ...
- hdfs深入:03、hdfs的架构以及副本机制和block块存储
HDFS分布式文件系统设计目标 1. 硬件错误 由于集群很多时候由数量众多的廉价机组成,使得硬件错误成为常态 2. 数据流访问 所有应用以流的方式访问数 ...
- JS授权
(function(){ var origin_url = location.href; var oauth_url = 'https://vx.mcilife.com/weixin/api/oaut ...
- 循环中i++和++i哪个好
推荐使用++i,因为不需要返回临时对象,执行效率更高.