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 ...
随机推荐
- Android_7.1.1_r6源码编译
上篇文章讲述了如何下载Android源码,在篇文章就来说一说Android源码编译.其实一般来说如果修改的软件和底层没什么关系,直接提取相应的源代码到Android Studio编译就可以了,如果是与 ...
- 哈夫曼编解码压缩解压文件—C++实现
前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩.本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现. 哈夫曼编码的概念 哈夫曼树又称作 ...
- mac 10.14.5 [vue create的时候 mkdir没有权限]
1.vue create的时候 mkdir没有权限 2.第一步.先检查系统是否开启了安全模式 csrutil status 3.如果是disabled.进去步骤5,直接查看文件夹权限.如果是enabl ...
- VLAN之间通信-三层交换机实现
1.打开三层交换机的命令行,配置VLAN和设置端口IP enable //进入特权模式 configure terminal //进入全局配置模式 ip routing //启动交换机的路由功能 vl ...
- PAT甲级 排序题_C++题解
排序题 PAT (Advanced Level) Practice 排序题 目录 <算法笔记> 6.9.6 sort()用法 <算法笔记> 4.1 排序题步骤 1012 The ...
- spring中使用动态代理(AOP)
spring是整合了BGLIB和JDK两种动态代理 示例:使用CGLIB代理 public class MyCar { private String color = "blue"; ...
- Mac机安装RedisCluster
版本信息 mac版本:10.14.5 redis版本:5.0.7 Step 1 : 安装redis-cli命令 安装redis-cli命令方法有N种,这里只列举一种,参考地址:<在 Mac 上搭 ...
- Linux下如何查看tomcat是否启动、查看tomcat启动日志
在Linux系统下,重启Tomcat使用命令的操作! 1.首先,进入Tomcat下的bin目录 cd /usr/local/tomcat/bin 使用Tomcat关闭命令 ./shutdown.sh ...
- (十一)easyUI之下拉框
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- (一)Redis之简介和windows下安装radis
一.简介 1.1 关于nosql 介绍Redis之前,先了解下NoSQL (Not noly SQL)不仅仅是SQL, 属于非关系型数据库:Redis就属于非关系型数据库, 传统的Mysql ,ora ...