美文网首页
【Java】Collection,List,ArrayList,

【Java】Collection,List,ArrayList,

作者: NoFacePeace | 来源:发表于2017-10-01 13:23 被阅读0次

    Collection

    Collection是Java集合的一个根接口,JDK没有它的实现类。内部仅仅做add(),remove(),contains(),size()等方法的声明。

    List

    List接口是Collection接口的一个子类,在Collection基础上扩充了方法。同时可以对每个元素插入的位置进行精确的控制,它的主要实现类有Arraylist,Vector,LinkedList。
    这里需要注意的是,List接口的实现类插入的值允许为空,也允许重复。

    ArrayList

    ArrayList实现了List接口,意味着可以插入空值,也可以插入重复的值,非同步,它是基于数组的一个实现。

    • ArrayList可以插入空值,也可以插入重复值
    • ArrayList是基于数组的时候,所有很多数组的特性也直接应用到了ArrayList。
    • ArrayList的性能消耗主要来源于扩容和固定位置的增删。
    • ArrayList创建的时候,需要考虑是否要初始化最小容量,以此避免扩容带来的消耗。

    Vector

    上述的ArrayList不是线程安全的。那么Vector就可以看作是ArrayList的一个线程安全版本。由于也是实现了List接口,所以也是可以插入空值,可以插入重复的值。它和HashTable一样,是属于一种同步容器,而不是一种并发容器。

    • 可以插入空值,也可以插入重复值
    • 也是基于数组的实现,所以很多数组的特性也直接应用到了Vector。
    • 性能消耗也主要来源于扩容。
    • 创建的时候需要考虑是否要初始化最小容量,以此避免扩容带来的消耗。
    • 相当于ArrayList的线程安全版本,实现同步的方式是通过synchronized。

    LinkedList

    LinkedList实现了List接口,所以LinkedList也可以放入重复的值,也可以放入空值。LinkedList不支持同步。LinkedList不同于ArrrayList和Vector,它是使用链表的数据结构,不再是数组。
    当进行增删的时候,只需要改变指针,并不会像数组那样出现整体数据的大规模移动,复制等消耗性能的操作。

    对比

    • 实现方法:
      • ArrayList,Vector是基于数组的实现
      • LinkedList是基于链表的实现
    • 同步问题
      • Arraylist,LinkedList不是线程安全的
      • Vector是线程安全的,实现方式是在方法中加synchronized进行限定。
    • 适用场景和性能消耗
      • ArrayList和Vector由于是基于数组的实现,所以在固定位置插入,固定位置删除这方面会直接是O(n)的时间复杂度,另外可能会出现扩容的问题,这是非常消耗性能的。
      • LinkedList不会出现扩容的问题,所以比较适合增删的操作。但是由于不是数组的实现,所以在定位方面必须使用遍历的方式,这会有O(n)的时间复杂度。

    相关文章

      网友评论

          本文标题:【Java】Collection,List,ArrayList,

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