先给结论,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-集合处理数据的效率差异的更多相关文章

  1. java 集合删除数据

    public static void main(String[] args) { List<Integer> list = new ArrayList<>(Arrays.asL ...

  2. java的缓冲流及使用Properties集合存取数据(遍历,store,load)

    缓冲流 概述 字节缓冲流:BufferedInputStream,BufferedOutputStream 字符缓冲流:BufferedReader,BufferedWriter 缓冲流原理 缓冲区是 ...

  3. Java://Comparator、Comparable的用法(按照要求将set集合的数据进行排序输出):

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; //comparator. ...

  4. Java学习:Set接口与HashSet集合存储数据的结构(哈希表)

    Set接口 java.util.Set接口 extends Collection接口 Set接口的特点: 不允许存储重复的元素 没有索引,没有带索引的方法,也不能使用普通的for循环遍历 java.u ...

  5. Java中AWT、Swing与SWT三大GUI技术的原理与效率差异

    Java中AWT.Swing与SWT三大GUI技术的原理与效率差异 转 https://blog.csdn.net/weixin_37703598/article/details/81843810   ...

  6. Java集合框架梳理(含经典面试题)

    Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含一组接口,类的体系结构. 1. 整体框架 Java容器类库一共有两种主要类型:Collection ...

  7. Java集合框架(比较啰嗦)

    阅读目录 概念与作用 集合框架的体系结构 Collection接口和List接口简介 Map和HashMap简介 集合工具类:Collections 小结 概念与作用 集合概念 现实生活中:很多事物凑 ...

  8. Java集合--HashMap分析

    HashMap在Java开发中有着非常重要的角色地位,每一个Java程序员都应该了解HashMap. 本文主要从源码角度来解析HashMap的设计思路,并且详细地阐述HashMap中的几个概念,并深入 ...

  9. java集合的简单用法

    typora-root-url: iamge [TOC] 1.集合接口 1.1将集合的接口与实现分离 ​ 与现代的数据结构类库的常见情况一样,Java集合类库也将接口(interface)与实现(im ...

随机推荐

  1. VBA来实现已存在的数据库,取得所有表的结构

    问题描述 用VBA来取出MySQL数据库中的所有表的结构后生成一个Excel的文档 首先创建MySQL的数据源,如何创建数据源在前章已经写过,之后把下面的信息填写上即可 在window7 64位系统上 ...

  2. LinkedList的基本用法

    LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用. 博客原文地址链接:http://blog.csdn.net/i_lovefish/article/details ...

  3. Centos7.3安装jdk和maven

    安装jdk和maven             通过winscp上传jdk             解压                 tar -zxvf jdk-8u91-linux-x64.ta ...

  4. 利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

    4.2 通用函数:快速的元素级数组函数 通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数. 1)一元(unary)ufunc,如,sqrt和exp函数 2)二元(unary) ...

  5. WUSTOJ 1889: 编辑距离(Java)

    转自:

  6. Spring @Transactional注解在什么情况下会失效,为什么?

    出处:  https://www.cnblogs.com/hunrry/p/9183209.html   https://www.cnblogs.com/protected/p/6652188.htm ...

  7. 『Python基础练习题』day02

    1.判断下列逻辑语句的True, False 1) 1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6 2) ...

  8. jenkins 打安卓包 cpu使用过高处理操作

    登录两个控制台 打包开始后 在其中一台机器执行ps -ef |grep jenkins 找到执行打包的主进程复制pid 在另一个终端上执行 top -H -p pid 将最耗cpu的线程id转换为16 ...

  9. redis的安装---Linux

    1.下载https://redis.io/download wget http://download.redis.io/releases/redis-4.0.14.tar.gz tar -zxvf r ...

  10. (十四)角色管理(Ztree插件的基本使用)

    1. 建表 角色表 菜单表 角色-菜单(这个表中的role_id和menuu_id都不能被设置为主键,否则当插入一个新角色的时候,一个角色可能拥有多个菜单(role_id重复),一个菜单可能被多个角色 ...