各自特性:
ArrayList : 是一由连续的内存块组成的数组,范围大小可变的,当不够时增加为原来1.5倍大小,数组。 :调用trimToSize方法,使得存储区域的大小调整为当前元素数量所需要的空间大小,垃圾回收器将会回收多余存储空间。
LinkedList
: 是由随机内存块通过指针连接起来的,范围大小可变的,当不够时增加为原来2倍大小,一个双向链表,
书上得来: 结论一 : ArrayList集合访问查找比LinkedList集合速度快,
结论二 : LinkedList集合增删元素比ArrayList集合速度快。
原因:
ArrayList是连续的内存地址,访问时根据下标,即与首地址的偏移量来确定元素;LinkedList集合是随机内存地址,查找时需要遍历链表,如果需要查找元素位于链表末尾,也只有老老实实把前面的挨个儿查看比较一番,所以有了结论一。
ArrayList集合每删除一个元素,GC会回收没有引用的那块内存地址,所以删除一个元素整个的集合元素要移动一下位置,那么如果删除了第一个元素,很明显需要把后面的n-1个元素向前移动一个单位;LinkedList集合的随机内存地址数据结构使得每增加和删除一个元素,只需要修改前后两个元素的头尾指针即可,所以有了结论二。
看上去上面说的很有道理。。但是。。。这是真的吗??????
动手试一试,你会发现神奇之处!!!
public class Collection_ArrayListPK_LinkedList {
public static void main(String[] args)
{
// 测试访问比较
TestLook();
// 测试添加
// TestAdd();
public static void TestLook()
{
long [] timeBegin = new long[2];
long [] timeEnd = new long[2];
Integer [] ia = new Integer[5000];
for(int i=0;i<ia.length;i++)
ia[i] = i ;
Random rm = new Random();
int temp ;
/**
* 测试对大小为5000 的ArrayList进行100000次随机访问所用时间
*/
List alist = new ArrayList(Arrays.asList(ia));
timeBegin[0] = System.currentTimeMillis();
for(int k=0;k<100000;k++)
{
temp = (Integer)alist.get(rm.nextInt(5000));
}
timeEnd[0] = System.currentTimeMillis();
/**
* 测试对大小为5000 的LinkedList进行100000次随机访问所用时间
*/
List llist = new LinkedList(Arrays.asList(ia));
timeBegin[1] = System.currentTimeMillis();
for(int k=0;k<100000;k++)
{
temp = (Integer)llist.get(rm.nextInt(5000));
}
timeEnd[1] = System.currentTimeMillis();
System.out.println("+++分析对大小为5000 的LinkedList类型和ArrayList类型进行的100000次随机访问所用时间比较+++");
System.out.println("ArrayList的100000次随机访问速度测试:");
System.out.println("耗时:"+(timeEnd[0]-timeBegin[0])+"ms");
System.out.println("LinkedList的100000次随机访问速度测试");
System.out.println("耗时:"+(timeEnd[1]-timeBegin[1])+"ms");
/*
* 随机修改测试
*/
}
证明第一条结论:
public static void TestAdd()
{
long [] timeBegin = new long[2];
long [] timeEnd = new long[2];
Integer [] ia = new Integer[5000];
Random rm = new Random();
int temp ;
/**
* 测试对大小为5000 的ArrayList进行100000次随机访问所用时间
*/
List alist = new ArrayList(Arrays.asList(ia));
timeBegin[0] = System.currentTimeMillis();
for(int k=0;k<10000;k++)
{
alist.add(rm.nextInt(5000), 1);
}
timeEnd[0] = System.currentTimeMillis();
List llist = new LinkedList(Arrays.asList(ia));
timeBegin[1] = System.currentTimeMillis();
for(int k=0;k<10000;k++)
{
llist.add(rm.nextInt(5000), 1);
}
timeEnd[1] = System.currentTimeMillis();
System.out.println("+++分析对大小为5000 的LinkedList类型和ArrayList类型进行的10000次随机添加所用时间比较+++");
System.out.println("ArrayList的10000次添加速度测试:");
System.out.println("耗时:"+(timeEnd[0]-timeBegin[0])+"ms");
System.out.println("LinkedList的10000次添加速度测试");
System.out.println("耗时:"+(timeEnd[1]-timeBegin[1])+"ms");
}
public static void TestAdd()
{
long [] timeBegin = new long[10];
long [] timeEnd = new long[10];
Integer [] ia = new Integer[5000];
Random rm = new Random();
int temp ;
/**
* 测试对大小为5000 的ArrayList进行100000次随机访问所用时间
*/
List alist = new ArrayList(Arrays.asList(ia));
// 100
timeBegin[0] = System.currentTimeMillis();
for(int k=0;k<100;k++)
{
alist.add(rm.nextInt(5000), 1);
}
timeEnd[0] = System.currentTimeMillis();
// 1000
timeBegin[1] = System.currentTimeMillis();
for(int k=0;k<1000;k++)
{
alist.add(rm.nextInt(5000), 1);
}
timeEnd[1] = System.currentTimeMillis();
//10000
timeBegin[2] = System.currentTimeMillis();
for(int k=0;k<10000;k++)
{
alist.add(rm.nextInt(5000), 1);
}
timeEnd[2] = System.currentTimeMillis();
// 50000
timeBegin[6] = System.currentTimeMillis();
for(int k=0;k<50000;k++)
{
alist.add(rm.nextInt(5000), 1);
}
timeEnd[6] = System.currentTimeMillis();
// 100000
timeBegin[8] = System.currentTimeMillis();
for(int k=0;k<100000;k++)
{
alist.add(rm.nextInt(5000), 1);
}
timeEnd[8] = System.currentTimeMillis();
List llist = new LinkedList(Arrays.asList(ia));
// 100
timeBegin[3] = System.currentTimeMillis();
for(int k=0;k<100;k++)
{
llist.add(rm.nextInt(5000), 1);
}
timeEnd[3] = System.currentTimeMillis();
// 1000
timeBegin[4] = System.currentTimeMillis();
for(int k=0;k<1000;k++)
{
llist.add(rm.nextInt(5000), 1);
}
timeEnd[4] = System.currentTimeMillis();
// 10000
timeBegin[5] = System.currentTimeMillis();
for(int k=0;k<10000;k++)
{
llist.add(rm.nextInt(5000), 1);
}
timeEnd[5] = System.currentTimeMillis();
// 50000
timeBegin[7] = System.currentTimeMillis();
for(int k=0;k<50000;k++)
{
llist.add(rm.nextInt(5000), 1);
}
timeEnd[7] = System.currentTimeMillis();
// 100000
timeBegin[9] = System.currentTimeMillis();
for(int k=0;k<100000;k++)
{
llist.add(rm.nextInt(5000), 1);
}
timeEnd[9] = System.currentTimeMillis();
System.out.println("+++分析对大小为5000 的LinkedList类型和ArrayList类型进行的10000次随机添加所用时间比较+++");
System.out.println("ArrayList的添加速度测试:");
System.out.println("100次");
System.out.println("ArrayList -耗时:"+(timeEnd[0]-timeBegin[0])+"ms");
System.out.println("LinkedList -耗时:"+(timeEnd[3]-timeBegin[3])+"ms");
System.out.println("1000次");
System.out.println("ArrayList -耗时:"+(timeEnd[1]-timeBegin[1])+"ms");
System.out.println("LinkedList -耗时:"+(timeEnd[4]-timeBegin[4])+"ms");
System.out.println("10000次");
System.out.println("ArrayList -耗时:"+(timeEnd[2]-timeBegin[2])+"ms");
System.out.println("LinkedList -耗时:"+(timeEnd[5]-timeBegin[5])+"ms");
System.out.println("50000次");
System.out.println("ArrayList -耗时:"+(timeEnd[6]-timeBegin[6])+"ms");
System.out.println("LinkedList -耗时:"+(timeEnd[7]-timeBegin[7])+"ms");
System.out.println("100000次");
System.out.println("ArrayList -耗时:"+(timeEnd[8]-timeBegin[8])+"ms");
System.out.println("LinkedList -耗时:"+(timeEnd[9]-timeBegin[9])+"ms");
}
结果一:
+++分析对大小为5000 的LinkedList类型和ArrayList类型进行的100000次随机访问所用时间比较+++
ArrayList的100000次随机访问速度测试:
耗时:27ms
LinkedList的100000次随机访问速度测试
耗时:225ms
补充: 多次测试证明第一条结论是对的。。。这哈踏实了。
结果二:
+++分析对大小为5000 的LinkedList类型和ArrayList类型进行的10000次随机添加所用时间比较+++
ArrayList的添加速度测试:
100次
ArrayList -耗时:2ms
LinkedList -耗时:3ms
1000次
ArrayList -耗时:2ms
LinkedList -耗时:5ms
10000次
ArrayList -耗时:46ms
LinkedList -耗时:91ms
50000次
有没有发现新大陆的感觉???
ArrayList -耗时:517ms
LinkedList -耗时:708ms
100000次
ArrayList -耗时:4316ms
LinkedList -耗时:1455ms
补充: 看来第二个结论有点问题咯。。说得太绝对了。。。
分析后者原因: 得出第二个结论主要是考虑增删元素的处理的时间去了,忽略了一个问题,就是查找到该元素的时间,ArrayList 集合
虽然处理慢,但是查找很快。。有优势的也有弱势之处,当优势和弱势比例不同自然而然结果就不一样。。所以看到新大陆了是应该的。。。
- java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)
说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...
- 集合框架-ArrayList,Vector,Linkedlist
// ClassCastException 报错,注意,千万要搞清楚类型 * Vector的特有功能: * 1:添加功能 * public void addElement(Object obj) -- ...
- Java集合(六)--ArrayList、LinkedList和Vector对比
在前两篇博客,学习了ArrayList和LinkedList的源码,地址在这: Java集合(五)--LinkedList源码解读 Java集合(四)--基于JDK1.8的ArrayList源码解读 ...
- 毫不留情地揭开 ArrayList 和 LinkedList 之间的神秘面纱
先看再点赞,给自己一点思考的时间,思考过后请毫不犹豫微信搜索[沉默王二],关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有技术大佬整理的面试题, ...
- Java集合之ArrayList和LinkedList的实现原理以及Iterator详解
ArrayList实现可变数组的原理: 当元素超出数组内容,会产生一个新数组,将原来数组的数据复制到新数组中,再将新的元素添加到新数组中. ArrayList:是按照原数组的50%来延长,构造一个初始 ...
- java List集合记录 ArrayList和LinkedList的区别
一般大家都知道ArrayList和LinkedList的大致区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问 ...
- Java自学-集合框架 ArrayList和LinkedList的区别
ArrayList和LinkedList的区别 步骤 1 : ArrayList和LinkedList的区别 ArrayList ,插入,删除数据慢 LinkedList, 插入,删除数据快 Arra ...
- 集合总结--ArrayList、LinkedList、HashMap
一.概述 ArrayList:数组集合. 查询.修改.新增(尾部新增)快,删除.新增(队列中间)慢,适用于查询.修改较多的场景. LinkedList:双向链表集合.查 ...
- 集合引入(ArrayList、LinkedList)
1.引入 代替数组固定大小操作不变 2.ArrayList 常用的操作(add,remove) 3.LinkedList 能实现一些特殊的操作(pop)
随机推荐
- json转换成dart类 JSON to Dart
json_to_dart的使用 如果我们得到一个特别复杂的JSON,有时候会无从下手开始写Model,这时候就可以使用一些辅助工具.我认为json_to_dart是比较好用的一个.它可以直接把json ...
- 从Odds:比值比推导出Logtic分类的算法
在从概率模型推导出逻辑回归算法模型的博文中,我试着从李宏毅老师的课程中讲到的概率模型去推导逻辑分类的算法模型.有幸看到另外一篇博文01 分类算法 - Logistic回归 - Logit函数,我了解到 ...
- Linux 之 netstat使用
netstat介绍 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast ...
- 百度之星2019第一场1002 Game
思路: 离散化之后dp,dp[i][j]表示完成前i个任务并且处在第j个点所需要的最小代价. 实现: #include <bits/stdc++.h> using namespace st ...
- 【编程开发】C语言中随机数rand使用注意事项
[编程开发]C语言中随机数rand使用注意事项 标签: [编程开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:随机数在编程开发中非常重要,以C语 ...
- Python+requests 发送简单请求--》获取响应状态--》获取请求响应数据
Python+requests 发送简单请求-->获取响应状态-->获取请求响应数据 1.环境:安装了Python和vscode编译器(Python自带的编译器也ok).fiddler抓包 ...
- 【HDU】6242-Geometry Problem
今天忽然心血来潮打开牛客网尝试了一下一站到底 前四道题都是不到二十分钟切完,然后第五道来了道计算几何 我也不会啊,于是就觉得大力随机也许可行 然鹅被精度卡到崩溃 后来我才知道 保证有解,是保证你的精度 ...
- (二十八)动态盐的MD5加密算法(java实现)
目录 文章目录 @[toc] 源代码: 函数用法讲解: 用法代码实例: 对比普通 **`MD5`** 的优点 实现思路: 后来我发现,BCryptPasswordEncoder 是这个思路的实现的最优 ...
- JavaScript之二分法
二分法: 二分查找,又称为折半查找. 注意:二分法查找的数组必须是有序的. /* 获取元素88在数组中第一次出现的索引位置 如果数组元素中存在88,则直接返回88在数组中的索引位置即可. 如果 ...
- Python Des加密与解密实现软件注册码、机器码
原理 判断路径下是否存在识别文件,若存在就解密对比,若不存在就进入机器码注册: 获取系统C盘序列号作为识别ID,并添加随机数作为混淆,生成最终机器码. 将机器码发给软件开发者,开发者将机器码解密后,添 ...