zoukankan      html  css  js  c++  java
  • AarryList和LinkedList比较

    从类名可以看出,AarryList是基于数组的增删查改,LinkedList是基于链表的。在这篇文章中,主要想通过三个方面来介绍:

    1)ArrayList的设计。

    2)LinkedList的设计。

    3)AarryListLinkedList的比较。

     

    ArrayList的设计

    ArrayList是基于数组的,在初始化ArrayList时,会构建空数组(Object[] elementData={})。ArrayList是一个无序的,它是按照添加的先后顺序排列,当然,他也提供了sort方法,如果需要对ArrayList进行排序,只需要调用这个方法,提供Comparator比较器即可。

    add操作:

    1)如果是第一次添加元素,数组的长度被扩容到默认的capacity,也就是10.

    2)  当发觉同时添加一个或者是多个元素,数组长度不够时,就扩容,这里有两种情况:

    只添加一个元素,例如:原来数组的capacity10size已经为10,不能再添加了。需要扩容,新的capacity=old capacity+old capacity>>1=10+10/2=15.即新的容量为15

    当同时添加多个元素时,原来数组的capacity10size10,当同时添加6个元素时。它需要的min capacity16,而按照capacity=old capacity+old capacity>>1=10+10/2=15new capacity小于min capacity,则取min capacity

    对于添加,如果不指定下标,就直接添加到数组后面,不涉及元素的移动,如果要添加到某个特定的位置,那需要将这个位置开始的元素往后挪一个位置,然后再对这个位置设置。

    Remove操作:

    Remove提供两种,按照下标和value

    1)remove(int index)。首先需要检查Index是否在合理的范围内。其次再调用System.arraycopyindex之后的元素向前移动。

    2)remove(Object o)。首先遍历数组,获取第一个相同的元素,获取该元素的下标。其次再调用System.arraycopyindex之后的元素向前移动。

    Get操作:

    这个比较简单,直接对数组进行操作即可。

     

    LinkedList的设计

    LinkedList是基于链表的,它是一个双向链表,每个节点维护了一个prevnext指针。同时对于这个链表,维护了firstlast指针,first指向第一个元素,last指向最后一个元素。LinkedList是一个无序的链表,按照插入的先后顺序排序,不提供sort方法对内部元素排序。

     

    Add元素:

     LinkedList提供了几个添加元素的方法:addFirstaddLastaddAlladd等,时间复杂度为O(1)

    Remove元素:

     LinkedList提供了几个添加元素的方法:removeFirstremoveLastremoveFirstOccurrenceremove等,时间复杂度为O(1)

    Get元素:

    根据给定的下标index,判断它first节点、last直接距离,如果index<size(数组元素个数)/2,就从first开始。如果大于,就从last开始。这个和我们平常思维不太一样,也许按照我们的习惯,从first开始。这也算是一点小心的优化吧。

     

    AarryListLinkedList的比较

    1)无序:按照添加元素的先后顺序排列。

    2)时间复杂度

       添加:如果是不指定index,因LinkedList维护了last指针,故两者的时间复杂度为O(1)。若指定Index,对于AarryList查找该元素时间复杂度为O(1),但需要进行数组移动,对于LinkedList查找该元素的时间复杂度为O(n),不需移动元素,只需改变指针关系。

       删除:对于AarryList查找该元素时间复杂度为O(1),但需要进行数组移动。对于LinkedList查找该元素的时间复杂度为O(n),不需移动元素,只需改变指针关系。

       查询:AarryList查找该元素时间复杂度为O(1)LinkedList会根据index与数组元素个数之间的关系,决定是从first开始还是last开始。时间复杂度为O(n/2

    3)扩容AarryListcapacity不够时,需要扩容,而LinkedList不需要。故对于AarryList而言,capacity的设置还是很重要的,要不然在程序运行过程中,不时的扩容,不时的移动数组元素,还是很消耗性能的。

       总结:至于在系统中到底有哪一个,还是根据业务场景来定。如果业务需要频繁的对这个数据结构进行删除操作。那还是用LinkedList。如果添加、查询涉及较多,就用ArrayList。这纯属个人意见。

     

     

     

  • 相关阅读:
    牛客-Python-字符流中第一个不重复的字符
    牛客网-python-表示数值的字符串
    牛客网-(标星)正则表达式的匹配
    牛客网-构建乘积数组
    牛客网-和为S的两个数字
    new code-和为S的连续正数序列
    newcode-平衡二叉树
    Reinforcement Learning学习笔记|Deep Q-learning算法
    Reinforcement Learning学习笔记|Q-learning算法
    C++|重拾|笔记20190307
  • 原文地址:https://www.cnblogs.com/icbcfang/p/5420717.html
Copyright © 2011-2022 走看看