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

  • 相关阅读:
    陪诊小程序系统平台功能模式
    关于C++解决内存泄漏问题的心得
    2023高教社杯数学建模国赛B题思路解析+代码+论文
    基于MATLAB的遗传算法与模拟退火算法相结合的仓库拣货小车最优路径规划
    计算机中的编码问题
    QT控件无法获取焦点问题
    G1回收器介绍
    stm32f334定时器配置详细解释
    开源软件的影响力及未来发展趋势
    qt5.15 升级 qt 6.5 部分问题 解决修复
  • 原文地址:https://blog.csdn.net/hzz_321/article/details/126911950