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