各自特性:
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 集合
虽然处理慢,但是查找很快。。有优势的也有弱势之处,当优势和弱势比例不同自然而然结果就不一样。。所以看到新大陆了是应该的。。。

集合篇-----ArrayList与LinkedList之间的那些小事的更多相关文章

  1. java集合(ArrayList,Vector,LinkedList,HashSet,TreeSet的功能详解)

    说起集合,我们会潜意识里想到另外一个与之相近的名词——数组,OK!两者确实有相似之处,但也正是这点才是我们应该注意的地方,下面简单列出了两者的区别(具体功能的不同学习这篇文章后就会明白了): 数组 长 ...

  2. 集合框架-ArrayList,Vector,Linkedlist

    // ClassCastException 报错,注意,千万要搞清楚类型 * Vector的特有功能: * 1:添加功能 * public void addElement(Object obj) -- ...

  3. Java集合(六)--ArrayList、LinkedList和Vector对比

    在前两篇博客,学习了ArrayList和LinkedList的源码,地址在这: Java集合(五)--LinkedList源码解读 Java集合(四)--基于JDK1.8的ArrayList源码解读 ...

  4. 毫不留情地揭开 ArrayList 和 LinkedList 之间的神秘面纱

    先看再点赞,给自己一点思考的时间,思考过后请毫不犹豫微信搜索[沉默王二],关注这个靠才华苟且的程序员.本文 GitHub github.com/itwanger 已收录,里面还有技术大佬整理的面试题, ...

  5. Java集合之ArrayList和LinkedList的实现原理以及Iterator详解

    ArrayList实现可变数组的原理: 当元素超出数组内容,会产生一个新数组,将原来数组的数据复制到新数组中,再将新的元素添加到新数组中. ArrayList:是按照原数组的50%来延长,构造一个初始 ...

  6. java List集合记录 ArrayList和LinkedList的区别

    一般大家都知道ArrayList和LinkedList的大致区别:      1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问 ...

  7. Java自学-集合框架 ArrayList和LinkedList的区别

    ArrayList和LinkedList的区别 步骤 1 : ArrayList和LinkedList的区别 ArrayList ,插入,删除数据慢 LinkedList, 插入,删除数据快 Arra ...

  8. 集合总结--ArrayList、LinkedList、HashMap

      一.概述        ArrayList:数组集合. 查询.修改.新增(尾部新增)快,删除.新增(队列中间)慢,适用于查询.修改较多的场景.        LinkedList:双向链表集合.查 ...

  9. 集合引入(ArrayList、LinkedList)

    1.引入 代替数组固定大小操作不变 2.ArrayList 常用的操作(add,remove) 3.LinkedList 能实现一些特殊的操作(pop)

随机推荐

  1. MemCache在.NET中使用Memcached.ClientLibrary详解

    本文说明:memcached分布式缓存的负载均衡配置比例,数据压缩,socket的详细配置等,以及在.net中的常用方法 首先下载客户端的3个dll,ICSharpCode.SharpZipLib.d ...

  2. python如何切割字符串

    python字符串的分割方法如下 str.split():字符串分割函数 通过指定分隔符对字符串进行切片,并返回分割后的字符串列表. 语法: str.split(s, num)[n] 参数说明: s: ...

  3. ~ android与ios的区别

    Oracle与Mysql的区别 项目类别 android ios 应用上 可以使用常用的android模拟器,来模拟各种android设备 只能直接使用iphone或ipad进行测试 开发语言 基于L ...

  4. Creating mailbox file: 文件已存在

    原来linux下添加用户后,会在系统里自动加一个邮箱(系统邮箱),路径是:/var/spool/mail/用户名.可以直接用命令#rm -rf /var/spool/mail/用户名 这样就可以再次添 ...

  5. k8s-PV和PVC使用

    上节课我们学习了 PV 的使用,但是在我们真正使用的时候是使用的 PVC,就类似于我们的服务是通过 Pod 来运行的,而不是 Node,只是 Pod 跑在 Node 上而已,所以这节课我们就来给大家讲 ...

  6. webpack打包时删除console.log,和debugger

    开发过程中我们不可避免的需要console.log调试,然而在上线时如果不删除这些console.log可能会造成内存泄漏,因为console.log出来的变量是不会被GC的,webpack给我们提供 ...

  7. luogu P4762 [CERC2014]Virus synthesis (回文自动机)

    大意: 初始有一个空串, 操作(1)在开头或末尾添加一个字符. 操作(2)在开头或末尾添加该串的逆串. 求得到串$S$所需最少操作数. 显然最后一定是由某个偶回文通过添加字符得到的, 那么只需要求出所 ...

  8. Scala学习二十一——隐式转换和隐式参数

    一.本章要点 隐式转换用于类型之间的转换 必须引入隐式转换,并确保它们可以以单个标识符的形式出现在当前作用域 隐式参数列表会要求指定类型的对象.它们可以从当前作用域中以单个标识符定义的隐式对象的获取, ...

  9. springboot打包war包部署到tomcat

    1.pom.xml修改处 <modelVersion>4.0.0</modelVersion><groupId>com.xx</groupId>< ...

  10. 设计模式风格<二>;消息总线

    以前开发的动车模拟驾驶系统,有好几个软件(不在一台机器上),他们互相之间通信,因此每个软件要配置每个模块的IP和端口,就是每个模块都要知道别的模块的端口和IP. 这样有个重复的地方,B模块和C模块都要 ...