美文网首页
Java集合框架(六)— List小结

Java集合框架(六)— List小结

作者: Sandy_678f | 来源:发表于2018-12-11 23:33 被阅读0次
    08214705-fbbcdd2d785f40f5b773041801bd74f1.jpg

    综述
    (01) List 是一个接口,它继承于Collection的接口。它代表着有序的队列。
    (02) AbstractList 是一个抽象类,它继承于AbstractCollection。AbstractList实现List接口中除size()、get(int location)之外的函数。
    (03) AbstractSequentialList 是一个抽象类,它继承于AbstractList。AbstractSequentialList 实现了“链表中,根据index索引值操作链表的全部函数”。
    (04) ArrayList, LinkedList, Vector, Stack是List的4个实现类。
      ArrayList 是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。
      LinkedList 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList随机访问效率低,但随机插入、随机删除效率高。
      Vector 是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,而Vector是线程安全的。
      Stack 是栈,它继承于Vector。它的特性是:先进后出(FILO, First In Last Out)。

    使用场景
    如果涉及到“栈”、“队列”、“链表”等操作,应该考虑用List,具体的选择哪个List,根据下面的标准来取舍。
    (01) 对于需要快速插入,删除元素,应该使用LinkedList。
    (02) 对于需要快速随机访问元素,应该使用ArrayList。
    (03) 对于“单线程环境” 或者 “多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList);对于“多线程环境,且List可能同时被多个线程操作”,此时,应该使用同步的类(如Vector,Stack)。

    Vector和ArrayList比较
    相同:
    1 它们都是List
    2 它们继承的类AbstractList,实现的接口相同List,Cloneable,RandomAccess,Serializable
    3 它们都是通过数组实现的,本质上都是动态数组
    4 它们的默认数组容量是10
    5 它们都支持Iterator和listIterator遍历
    不同:
    1 线程安全性不一样
    ArrayList是非线程安全;
    而Vector是线程安全的,它的函数都是synchronized的,即都是支持同步的。
    ArrayList适用于单线程,Vector适用于多线程。
    2 构造函数个数不同
    ArrayList有3个构造函数,而Vector有4个构造函数。Vector除了包括和ArrayList类似的3个构造函数之外,另外的一个构造函数可以指定容量增加系数。
    3 容量增加方式不同
    逐个添加元素时,若ArrayList容量不足时,“新的容量”=“(原始容量x3)/2 + 1”。即原容量的1.5倍。

    int newCapacity = oldCapacity + (oldCapacity >> 1);
    

    而Vector的容量增长与“增长系数有关”,若指定了“增长系数”,且“增长系数有效(即,大于0)”;那么,每次容量不足时,“新的容量”=“原始容量+增长系数”。若增长系数无效(即,小于/等于0),则“新的容量”=“原始容量 x 2”。
    4 对Enumeration的支持不同。Vector支持通过Enumeration去遍历,而List不支持。

    相关文章

      网友评论

          本文标题:Java集合框架(六)— List小结

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