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 ...
随机推荐
- mysql 查询结果为null 或 空字符串时,返回指定字符串
直接上代码, 亲测可用: SELECT IF ( ifnull( 字段, '' ) = '', '返回的字符串', 字段) AS 别名(或者不要也可以) FROM table
- GB和GIB的区别
天啦撸,这么多年才知道这个东西! Gibibyte(giga binary byte)是信息或计算机硬盘存储的一个单位,简称GiB.由来“GiB”,“KiB”,“MiB”等是于1999年由国际电工协会 ...
- BeginLinux Programming chapter16: X11桌面系统简介
当前两个最流行的linux desktop environment: GNOME 和KDE, 两者对应的图形库分别是 GTK+ 和 QT. GNOME与KDE与X11的关系: X defines no ...
- SpringBoot(二)启动原理
SpringBoot自动配置模块 该配置模块的主要使用到了SpringFactoriesLoader,即Spring工厂加载器,该对象提供了loadFactoryNames方法,入参为factoryC ...
- [转帖]Linux命令pmap
Linux命令pmap https://www.cnblogs.com/lnlvinso/p/5272771.html jmap可以查看Java程序的堆内存使用情况,pmap可以查看Linux上运行的 ...
- RecursiveSequence(HDU-5950)【矩阵快速幂】
题目链接: 题意:Si=S(i-1)+2*S(i-2)+i^4,求Sn. 思路:想到了矩阵快速幂,实在没想出来怎么构造矩阵.... 首先构造一个向量vec={a,b,16,8,4,2,1}. 在构造求 ...
- python3 获取自建gitlab用户提交信息
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019-12-03 14:20 # @Author : Anthony # @Emai ...
- Python 【收发邮件】
发邮件 smtplib模块主要负责发送邮件 email模块主要负责构造邮件.这两个都是Python内置模块 smtplib.SMTP.方法 #按住Ctrl键并点击SMTP ,会看到对SMTP的解释(v ...
- python2.7 编码问题
python 2.7编码问题,着实令人头疼不已,这两天抽闲想真正弄明白.需要弄清楚这个问题,首先需要明白ASCII,Unicode 和 UTF-8之间的关系. 进行对上述几种概念进行描述之前,先进行简 ...
- zcat +文件名.gz | grep "查找内容"
linux gz查看 zcat +文件名.gz | grep "查找内容" 解压 rar x xxxx.rar