前幾篇文章咱們重點說了ArrayLIst,是時候放出這張圖了。面試
這張圖裏的內容對咱們學習Java來講,很是的重要,白色的部分是須要去了解的,黃色部分是咱們要去重點了解的,不但要知道怎麼去用,至少還須要讀一次源碼。綠色部份內容已經不多用了,但在面試題中有可能會問到,咱們來看一個常常出現的面試題:Arraylist與Vector的區別是什麼?數組
首先咱們給出標準答案:
一、Vector是線程安全的,ArrayList不是線程安全的。
二、ArrayList在底層數組不夠用時在原來的基礎上擴展0.5倍,Vector是擴展1倍。安全
看上圖Vector和ArrayList同樣,都繼承自List,來看一下Vector的源碼數據結構
實現了List接口,底層和ArrayList同樣,都是數組來實現的。分別看一下這兩個類的add方法,首先來看ArrayList的add源碼多線程
再看Vector的add源碼post
方法實現都同樣,就是加了一個synchronized的關鍵字,再來看看其它方法,先看ArrayList的remove方法學習
再看Vector的remove方法ui
方法實現上也同樣,就是多了一個synchronized關鍵字,再看看ArrayList的get方法線程
Vector的get方法3d
再看看Vector的其它方法
無一例外,只要是關鍵性的操做,方法前面都加了synchronized關鍵字,來保證線程的安全性。當執行synchronized修飾的方法前,系統會對該方法加一把鎖,方法執行完成後釋放鎖,加鎖和釋放鎖的這個過程,在系統中是有開銷的,所以,在單線程的環境中,Vector效率要差不少。(多線程環境不容許用ArrayList,須要作處理)。
至於底層數組的擴容區別,這裏就不帶着你們讀源碼了,有興趣的朋友你們本身讀吧,底層代碼幾乎是同樣的,不一樣的只是計算後的新數組長度不一致。
和ArrayList和Vector同樣,一樣的相似關係的類還有HashMap和HashTable,StringBuilder和StringBuffer,後者是前者線程安全版本的實現。但願之後你們在面試過程當中,能說出個由於因此,而不是一味的去背面試題,惟有理解,無需再背。
注:關於線程安全性,後續文章會說,這裏只是簡單說這兩個類不同的地方。
上一篇:ArrayList的時間複雜度 - Java那些事兒專欄
注:本專欄文章首發於公衆號:saysayJava。全部示例代碼均已上傳至公衆號,須要請關注下載。
若是喜歡本系列文章,請爲我點贊或順手分享,您的支持是我繼續下去的動力,您也能夠在評論區留言想了解的內容,有機會本專欄會作講解,最後別忘了關注一下我。
轉載無限歡迎,但請註明「做者」和「原文地址」。轉載請在文中保留此段,感謝您對做者版權的尊重。如需商業轉載或刊登,請聯繫做者得到受權