美文网首页
ArrayList/Vector源码分析

ArrayList/Vector源码分析

作者: fisherman0510 | 来源:发表于2019-12-14 15:41 被阅读0次


    摘要:本篇文章为了巩固自身对于JDK源码的学习里面

    ArrayList


    ArrayList源码属性字段

    在ArrayList源码中,最重要的有2个字段, elementData:用来存放数据,一个size用来表示ArrayList的大小.

    ArrayList.add(); 首次添加元素的流程

    在代码238行有一个扩容的判断:

    扩容判断

    Java中有移位运算符

    <<      :     左移运算符,num << 1,相当于num乘以2的1次方

    >>      :     右移运算符,num >> 1,相当于num除以2的1次方

    数组长度扩容

    整个List的添加就已经结束了

    总结:

    1.ArrayList是有序的,在添加方法中可以看出来:

    ArrayList.add()

    2.也因为 size++  这个操作 不是原子性的,所以在多线程环境下,会导致线程不安全的问题;

    3.ArrayList底层利用数组的形式来进行存放数组元素;

    4.最大长度为 int的最大值

    最大长度



    Vector类:

    和ArrayList最大的区别点在于

    1.它是线程安全的,其余的特性和 Arraylist是一样的

    基本所有的方法都使用了 synchronize 关键字

    两者区别以及选择:


    1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。

    2.Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。

    3.LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

    4.vector是线程(Thread)同步(Synchronized)的,所以它也是线程安全的,而Arraylist是线程异步(ASynchronized)的,是不安全的。如果不考虑到线程的安全因素,一般用Arraylist效率比较高。

    5.如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%.如过在集合中使用数据量比较大的数据,用vector有一定的优势。

    6.如果查找一个指定位置的数据,vector和arraylist使用的时间是相同的,都是0(1),这个时候使用vector和arraylist都可以。而如果移动一个指定位置的数据花费的时间为0(n-i)n为总长度,这个时候就应该考虑到使用Linkedlist,因为它移动一个指定位置的数据所花费的时间为0(1),而查询一个指定位置的数据时花费的时间为0(i)。

    7.ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动 等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!

    笼统来说:LinkedList:增删改快

    ArrayList:查询快(有索引的存在)

    相关文章

      网友评论

          本文标题:ArrayList/Vector源码分析

          本文链接:https://www.haomeiwen.com/subject/mricnctx.html