java-集合处理数据的效率差异
先给结论,ArrayList数组结构的,插入和删除耗时长,get(index)耗时短。
LinkedList是链表结构的,插入和删除耗时短,get(index)耗时长。
常用的几种集合,ArrayList和LinkedList,看了一下这两种集合获取数据的效率。
public class TestList {
@Test
public void testLink() throws InterruptedException {
LinkedList <Integer> link = new LinkedList<Integer>();
for(int i = 0;i<100000;i++){
link.add(i);
}
long time1 = System.currentTimeMillis();
//用link找坐标,花费时间大
//用link遍历Iterator数据,开销少于arrayList
for(int i :link){
link.set(i,55);
} long time2 = System.currentTimeMillis();
System.out.println(time2-time1);
}
@Test
public void testArray() throws InterruptedException {
ArrayList<Integer> link = new ArrayList<Integer>();
for(int i = 0;i<100000;i++){
link.add(i);
}
long time1 = System.currentTimeMillis(); for(int i :link){
link.set(i,55);
}
long time2 = System.currentTimeMillis();
System.out.println(time2-time1);
}
}
结果
12
4809
用Iterator迭代器,遍历LinkedList和ArrayList进行set/get 操作,很明显ArrayList的耗时要高很多。
同样的,用for循环读下标也是。
另一个例子
public class TestList {
@Test
public void testLink() throws InterruptedException {
LinkedList <Integer> link = new LinkedList<Integer>();
long time1 = System.currentTimeMillis();
for(int i = 0;i<100000;i++){
link.add(i);
} //用link找坐标,花费时间大
//用link遍历Iterator数据,开销少于arrayList
long time2 = System.currentTimeMillis();
System.out.println(time2-time1);
}
@Test
public void testArray() throws InterruptedException {
ArrayList<Integer> link = new ArrayList<Integer>();
long time1 = System.currentTimeMillis();
for(int i = 0;i<100000;i++){
link.add(i);
}
long time2 = System.currentTimeMillis();
System.out.println(time2-time1);
}
}
结果
28
14
LinkedList在add时,耗时比ArrayList多一倍。
public class TestList {
@Test
public void testLink() throws InterruptedException {
LinkedList <Integer> link = new LinkedList<Integer>(); for(int i = 0;i<100000;i++){
link.add(i);
}
long time1 = System.currentTimeMillis();
for(int i = 500;i<1000;i++){
link.remove(i);
}
//用link找坐标,花费时间大
//用link遍历Iterator数据,开销少于arrayList
long time2 = System.currentTimeMillis();
System.out.println(time2-time1);
}
@Test
public void testArray() throws InterruptedException {
ArrayList<Integer> link = new ArrayList<Integer>(); for(int i = 0;i<100000;i++){
link.add(i);
}
long time1 = System.currentTimeMillis();
for(int i = 500;i<1000;i++){
link.remove(i);
}
long time2 = System.currentTimeMillis();
System.out.println(time2-time1);
}
}
结果
28
6
LinkedList在按照下标remove数据上,比ArrayList慢,这里和java-core上有些差异。
重新设置一下数据,让数据量较大,并且读取的数据较靠后,ArrayList的耗时就明显增加了。
public class TestList {
@Test
public void testLink() throws InterruptedException {
LinkedList <Integer> link = new LinkedList<Integer>(); for(int i = 0;i<1000000;i++){
link.add(i);
}
Iterator<Integer>it = link.iterator();
long time1 = System.currentTimeMillis();
for(int i = 99000;i<99599;i++){
link.remove(i);
} long time2 = System.currentTimeMillis();
System.out.println(time2-time1);
}
@Test
public void testArray() throws InterruptedException {
ArrayList<Integer> link = new ArrayList<Integer>(); for(int i = 0;i<1000000;i++){
link.add(i);
}
long time1 = System.currentTimeMillis();
for(int i = 99000;i<99599;i++){
link.remove(i);
}
long time2 = System.currentTimeMillis();
System.out.println(time2-time1);
}
}
结果:
291
898
这里摘抄一段java-core的解释,P568
数组和数组列表都有一个重大的缺陷,这就是从数组的中间位置删除一个元素要付出很大的代价,其原因是数组中处于被删除元素之后的所有元素都要向数组的前端移动,在数组中间的位置上插入一个元素也是如此。
从链表中间删除一个元素时一个很轻松的操作,即需要对被删除元素附近的节点更新一下即可。
但是链表与泛型集合之间有一个重要的区别,链表是一个有序集合(ordered collection),每个对象的位置十分重要。
这里又有一个疑问,P572说LinkedList下标读取object的效率不高,并且用for循环来读取下标的效率极低。事实上我测试的时候,ArrayList的get(i)效率更低,参见下面的代码。
public class TestList {
@Test
public void testLink() throws InterruptedException {
LinkedList <Integer> link = new LinkedList<Integer>();
for(int i = 0;i<100000;i++){
link.add(i);
}
long time1 = System.currentTimeMillis();
//用link找坐标,花费时间大
//用link遍历Iterator数据,开销少于arrayList
for(int i =0;i<10000;i++){
link.get(55);
} long time2 = System.currentTimeMillis();
System.out.println(time2-time1);
}
@Test
public void testArray() throws InterruptedException {
ArrayList<Integer> link = new ArrayList<Integer>();
for(int i = 0;i<100000;i++){
link.add(i);
}
long time1 = System.currentTimeMillis(); for(int i =0;i<10000;i++){
link.get(55);
}
long time2 = System.currentTimeMillis();
System.out.println(time2-time1);
}
}
结果就不贴了,跟第一段代码的set的效率差异差不多大。
很难懂啊。。。。
搜了一下,应该是我的代码有问题。后来发现可能是因为我有两个test,test可能执行上有差异导致的?没研究清楚,分开执行结果是正确的,放在一起执行就是有问题。。。
参考https://www.cnblogs.com/skywang12345/p/3308900.html
修改了一下测试代码
package enums; import org.junit.Test; import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; /**
* Created by user on 2019/7/2.
*/
public class TestList {
@Test
public void testLink() throws InterruptedException {
LinkedList <Integer> linklist= new LinkedList<>();
ArrayList<Integer>arrayList = new ArrayList<>();
addList(linklist);
addList(arrayList);
getList(linklist);
getList(arrayList);
}
public void getList(List list){
long startTime = System.currentTimeMillis();
for(int i =0;i<100000;i++){
list.get(i);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
}
public void addList(List list){
long startTime = System.currentTimeMillis();
for(int i =0;i<100000;i++){
list.add(i);
}
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
}
}
java-集合处理数据的效率差异的更多相关文章
- java 集合删除数据
public static void main(String[] args) { List<Integer> list = new ArrayList<>(Arrays.asL ...
- java的缓冲流及使用Properties集合存取数据(遍历,store,load)
缓冲流 概述 字节缓冲流:BufferedInputStream,BufferedOutputStream 字符缓冲流:BufferedReader,BufferedWriter 缓冲流原理 缓冲区是 ...
- Java://Comparator、Comparable的用法(按照要求将set集合的数据进行排序输出):
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; //comparator. ...
- Java学习:Set接口与HashSet集合存储数据的结构(哈希表)
Set接口 java.util.Set接口 extends Collection接口 Set接口的特点: 不允许存储重复的元素 没有索引,没有带索引的方法,也不能使用普通的for循环遍历 java.u ...
- Java中AWT、Swing与SWT三大GUI技术的原理与效率差异
Java中AWT.Swing与SWT三大GUI技术的原理与效率差异 转 https://blog.csdn.net/weixin_37703598/article/details/81843810 ...
- Java集合框架梳理(含经典面试题)
Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含一组接口,类的体系结构. 1. 整体框架 Java容器类库一共有两种主要类型:Collection ...
- Java集合框架(比较啰嗦)
阅读目录 概念与作用 集合框架的体系结构 Collection接口和List接口简介 Map和HashMap简介 集合工具类:Collections 小结 概念与作用 集合概念 现实生活中:很多事物凑 ...
- Java集合--HashMap分析
HashMap在Java开发中有着非常重要的角色地位,每一个Java程序员都应该了解HashMap. 本文主要从源码角度来解析HashMap的设计思路,并且详细地阐述HashMap中的几个概念,并深入 ...
- java集合的简单用法
typora-root-url: iamge [TOC] 1.集合接口 1.1将集合的接口与实现分离 与现代的数据结构类库的常见情况一样,Java集合类库也将接口(interface)与实现(im ...
随机推荐
- PPT 中用 LaTeX 插入公式、PowerPoint 中用 LaTeX 插入公式(4)
步骤: 1. 安装 CTex 2. 安装 IguanaTex >> 下载链接1:官网 >> 下载链接2:复制链接到迅雷或IDM下载很快 3. 将「IguanaTex_v1_56 ...
- wordpress 后台无法登录 网站内容缺失
昨天网站又突然不正常了,前两天都是好的.. 具体来说就是wp后台登录不进去,一直在登录页跳转,与此同时服务器上其他网站也有这个问题,而且有些网站的板块内容也缺失了, 所以首要就是要登录进后台看看是不是 ...
- PAT(B) 1005 继续(3n+1)猜想(Java)
题目链接:1005 继续(3n+1)猜想 分析 找出所有的被"覆盖"的数,然后再将输入的数中不在被"覆盖"的数中的数添加到"关健数"中.输 ...
- 1254: 盒子游戏(Java)
WUSTOJ 1254: 盒子游戏 参考博客 叶剑飞Victor的博客 盒子游戏--爱程序网 原理是从上面博客看的,我另外补充了几幅图,方便理解 Description 有两个相同的盒子,其中一个装了 ...
- TZOJ2882: 美食节之感恩父母
#include<stdio.h> int main() { ],b[],i,j,max,m,t1,t2,t3; while(scanf("%d",&m),m) ...
- 一个无法解析的外部命令and无法解析的外部符号
出现错误: 解决: 因为修改了函数定义的参数,但是没有修改函数声明的参数 把参数统一一下就行了
- 使用DANT做FTP的转发代理
FTP不能直接使用nginx进行转发,想了一些办法,最后决定使用iptalbes做DNAT,相关于把这个机器做一台防火墙,做一个NAT 1.启用ip_forward vim /etc/sysctl.c ...
- 2019牛客多校四 E. triples II (容斥)
大意: 给定$n,a$, 求$n$个$3$的倍数, $or$和为$a$的方案数. 简单容斥题 可以求出$f_{x,y}$表示所有$3$的倍数中, 奇数位不超过$x$个$1$, 偶数位不超过$y$个$1 ...
- awr报告没有数据11.2.0.3
有个朋友,反馈AWR没有数据: 咨询版本:oracle企业版本11.2.0.3 SQL> select * from v$version; BANNER -------------------- ...
- 怎样解决多层this指向全局对象window的问题
如下所示, 得到的结果里面, 第二个this指向的是window这个全局对象而非f2, 原因就是多层this造成的指向不明引起的. var a = { f1: function(){ console. ...