ArrayList、Vector和LinkedList比较

数据结构

         ArrayList

                动态object[ ]数组

          Vector

                动态object[ ]数组

         LinkedList

                双向链表结构

扩容机制

        ArrayList

        1)调用无参构造器,默认为elementData数组赋予长度为10,需再次扩容时,扩为elementData数组长度的1.5倍。

        2)调用有参构造器,创建了一个固定大小的elementData数组,需再次扩容时,扩为elementData数组长度的1.5倍。

        Vector

         1)当创建方式为 List list = new ArrayList(0)时,默认调用EMPTY_ELEMENTDATA初始化容量为0,当首次添加元素时,elementData数组长度容量扩为 10,之后再次扩容时变为原先的1.5倍;

        2)当创建方式为 List list = new ArrayList(10)时,创建了一个指定长度的elementData数组,如果需要再次扩容时,则直接扩容elementData数组长度为原先的1.5倍。

        3)使用无参构造器创建ArrayList对象,不会定义elementdata数组的长度,当第一次调用add(E e) 方法时,初始化定义底层数组的长度为10,之后调用add(E e)时,如果需需要再次扩容,则调用grow(int minCapacity) 进行扩容,长度为原来的1.5倍。
     

        LinkedList

        1)LinkedList底层维护了一个双向链表;

        2)LinkedList中维护了两个属性first和last分别指向首节点和尾节点;

        3)每个节点(Node对象),里面又维护了prev、next、item三个属性,其中通过prev指向前一个,通过next指向后一个节点,最终实现双向链表;

        4)通过改变指针指向来实现数据扩容

线程安全性

         ArrayList

                线程非安全

          Vector

                线程安全,底层所有方法都是通过synchronized关键字实现的

         LinkedList

                线程非安全

增删改查的效率


           ArrayList和Vector中,从指定的位置检索一个对象,或在集合的末尾插入,删除一个元素的时间是一样的,时间复杂度都是O(1)。但是如果在其他位置增加或者删除元素花费的时间是O(n),LinkedList中,在插入、删除任何位置的元素所花费的时间都是一样的,时间复杂度都为O(1),但是他在检索一个元素的时间复杂度为O(n)。所以如果只是查找特定位置的元素或只在集合的末端增加移动元素,那么使用ArrayList或Vector都是一样的。如果是在指定位置的插入、删除元素,最好选择LinkedList(拷贝别人的,但是链接找不到)

        总结:ArrayList:动态数组结构,线程非安全,查询速度较快,

                   LinkedList:双向链表结构,线程非安全,增删比较块,

                   Vector :动态数组结构,线程安全。

        java中数据存储方式最底层的两种结构,一种是数组,另一种就是链表,数组的特点:连续空间,寻址迅速,但是在删除或者添加元素的时候需要有较大幅度的移动,所以查询速度快,增删较慢。而链表正好相反,由于空间不连续,寻址困难,增删元素只需修改指针,所以查询慢、增删快。有没有两者的结合呢?有,哈希表具有较快(常量级)的查询速度,及相对较快的增删速度(拷贝别人的,但是链接找不到)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值