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 ...
随机推荐
- jquery判断元素是否包含某class
// <div id="id" class="add on"></div> var flag = $("#id"). ...
- Django之ORM表操作
ORM表操作 1.ORM单表操作 首先想操作表的增删改查,需要先导入这个表,以之前创建的UserInfo表为例,在app下的views.py中导入 from app import models def ...
- MongoDB查询操作
按条件查询 比较操作:$lt,$lte,$gt,$gte,$ne db.user.find({}}); $or :包含多个条件,他们之间为or的关系 ,$nor相当于or取反 db.user.find ...
- jq使用ajax请求,返回状态 canceled错误
在使用jq,ajax请求时出现该错误 原因:button按钮类型为type=submit ,script中又自定用botton按钮点击提交ajax,造成冲突. 解决方法:button按钮类型改为 ty ...
- sqlserver 聚集索引 非聚集索引
聚集索引是一种对磁盘上实际数据重新组织以按指定的一列或者多列值排序.像我们用到的汉语字典,就是一个聚集索引.换句话说就是聚集索引会改变数据库表中数据的存放顺序.非聚集索引不会重新组织表中的数据,而是对 ...
- linux重启php服务
- (三)使用Intent在活动中穿梭:显式和隐式Intent
一.显式Intent @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstan ...
- 洛谷 P1047 校门外的树(待完善)
链接:https://www.luogu.org/problemnew/show/P1047 题目: 题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是11米.我们可以把马路看 ...
- Django迁移
Django迁移 学习目标: 如何在不编写任何SQL语句的情况下创建数据库表 更改model如何自动修改数据库 如何还原对数据库所做的更改 迁移能解决的问题 如果你不了解Django或者WEB开发,肯 ...
- JS中的兼容性问题
事件对象兼容 window.event只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用.Firefox必须从源处加入event作 ...