美文网首页
【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