java基礎提升之Vector

        上一篇中咱們介紹了ArrayList。其實在ArrayList的源碼註釋中就明確的指出了ArrayList這個類大體的等於Vector除了ArrayList是不一樣步的。那麼如今趁熱打鐵,咱們開始學習一下Vector。 java

結構分析

RandomAccess

        這個Vector一樣也實現了RandomAccess這個標記類,同ArrayList同樣,表明可以高效的實現隨機訪問。數組

存儲結構

同上篇同樣,咱們也是先來看看Vector的屬性 安全

能夠看到,屬性相比ArrayList的少了,那如今咱們來看看這幾個東西是幹啥的。dom

  1. elementData: 這個elementData的做用跟ArrayList中的同樣,都是用來存儲元素的,這個數組的長度也就是這個Vector的容量。
  2. elementCount: 這個和ArrayList中的size差很少都是用來記錄存儲元素的數量的,好比如今Vector中有2個元素,這個elemetnCount=2;
  3. capacityIncrement: 這個屬性就有點意思了,咱們能夠發現ArrayList中沒有跟這個相似的東西,其實在我我的認爲這也是一個Vector與ArrayList之間的一個不一樣點。 那這個屬性是用來幹啥的呢? 從名字咱們能夠猜出大概,容量增量,其實就是擴容的時候用來定義擴容多少的,咱們會在下面擴容的內容中詳細解說。

很簡單,屬性就上面那三個。咱們能夠發現Vector的底層存儲結構就是一個數組性能

基本方法

        對於Vector的基本方法,不作太多介紹,其實就是對數組的操做,主要,對於數組的移位操做使用的System.arraycopy來完成,還有一個特色相比較ArrayList來講就是他的許多方法都有一個關鍵字synchronized。這就是爲何說Vector是同步的緣由。咱們看一下下面的圖來體會一下: 學習

subList

咱們重點說一下subList方法,同時也是對ArrayList的一個補充。spa

subList返回的List是基於這個Vector或者ArrayList的的,也就是說,對subList返回的List進行的操做的結果最後會反映到源Vector或ArrayList上的,咱們用代碼來體會一下:線程

public class TestMain {
    public static void main(String[] args){
        System.out.println("===============ArrayList=================");
        List<String> list = new ArrayList<>(Arrays.asList("1", "2", "3", "4", "5"));
        List<String> subList = list.subList(0,2);
        subList.add("我是subList插入的");
        list.forEach(value ->System.out.print(value+" ,") );
        System.out.println();
        System.out.println("===============Vector==================");
        Vector<String> vector = new Vector<>(Arrays.asList("1", "2", "3", "4", "5"));
        List<String> subVector = vector.subList(0,2);
        subVector.add("我是subVector插入的");
        vector.forEach(value ->System.out.print(value+" ,"));
    }
}
複製代碼

運行結果以下:3d

擴容機制

有上一節的鋪墊,咱們不作太多無用的的查看,直接看擴容的核心代碼:code

這就是Vector擴容的核心代碼,看到與ArrayList的大同小異,不過這裏確實多了一個這個東西,

在計算新的容量的時候,看了capacityIncrement的值是否是大於0,這個就是咱們所說Vector與ArrayList擴容的不一樣處了,Vector能夠自定義增加係數,控制須要擴容時增加的容量大小。當沒有指定時默認增加爲原來的兩倍,與ArrayList同樣,因爲數組不能動態增大,因此是使用Arrays.copyOf從新生成了一個數組。

總結

  1. Vector內部使用數組存儲元素,因爲在方法時加了synchronized,因此性能比ArrayList低,可是是線程安全的。
  2. Vector擴容機制與ArrayList有些不一樣,不一樣之處在於Vector能夠指定增加係數capacityIncrement,當不指定這個增加係數或者capacityIncrement爲0的狀況下默認擴容爲原來的兩倍。
相關文章
相關標籤/搜索