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),我们来看 ...
随机推荐
- .net mvc 运行监控和错误捕捉
方法类 /// <summary> /// 运行监控类 /// </summary> [AttributeUsage(AttributeTargets.Class | Attr ...
- centos7下配置tomcat开机启动
配置tomcat的开机启动1> 在centos7的/etc/rc.d/rc.local中加入:(注意自己的路径)#java environment export JAVA_HOME=/usr/j ...
- $.fn.extend的用法
$.fn.extend({ sfMessages: function(m) { $("p.tips").html('<span class="circle ioc ...
- Insert 语句对 nologging 与 logging表 在不同场景下的优化
前言 前段时间报表数据库上有条insert sql语句,插入的大量数据,执行非常慢,需要对其进行分析优化. 分析步骤是在:ARCHIVE与NOARCHIVE模式下进行. 测试场景: 分别对表的常规插入 ...
- Oracle 数据库实例启动关闭过程
Oracle数据库实例的启动,严格来说应该是实例的启动,数据库仅仅是在实例启动后进行装载.Oracle数据启动的过程被划分为 几个不同的步骤,在不同的启动过程中,我们可以对其实现不同的操作,系统修复等 ...
- mysql错误Error(1133): Can’t find any matching row in the use
执行插入用户语句没有问题,但是执行权限赋值的时候提示:1133 - Can't find any matching row in the user table; 解决办法:插入新的用户成功时,需要刷新 ...
- nginx+redis安装配置(内存型数据库)实现session的共享
注意:借鉴原文章:http://www.cnblogs.com/roy-blog/p/7196054.html 感兴趣的可以加一下481845043 java交流群,共同进步. 1 session的概 ...
- Python之“Hello World”
Python之“Hello World” 了解Python: 编译型和解释型 编译:把明文代码执行前,先转换成二进制,在执行.这个过程叫编译 解释器:将明文代码转成二进制的 Linux中,gcc编译, ...
- 当java web项目部署到服务器上时,无法将图片等媒体文件保存到服务器的最终奥义
今天,我在部署web项目至云服务器上(Tomcat8.0)时,突然发现我的应用,无法上传图片,视频等多媒体文件了,一再检查自己的代码逻辑没有问题之后,逐一排查,首先想到的就是看一下控制台打印的日志,日 ...
- 04001_HTML简单介绍
1.超文本标记语言 (1)超文本:比普通文本功能更加强大: (2)标记语言:使用一组标签对内容进行描述的一门语言,它不是编程语言! 2.HTML语法和规范 (1)所有的html文件后缀名都是以.htm ...