這幾天工作有點忙副瀑,有很多代碼需要寫想幻,更新文章有點慢,說聲抱歉弥虐,前幾天有人反饋LinkedList的文章不太看得懂扩灯,臨時準備補兩篇文章。
前幾篇文章我們重點說了ArrayLIst霜瘪,是時候放出這張圖了珠插。
這張圖里的內(nèi)容對我們學習Java來說,非常的重要颖对,白色的部分是需要去了解的捻撑,黃色部分是我們要去重點了解的,不但要知道怎么去用缤底,至少還需要讀一次源碼顾患。綠色部分內(nèi)容已經(jīng)很少用了,但在面試題中有可能會問到个唧,我們來看一個經(jīng)常出現(xiàn)的面試題:Arraylist與Vector的區(qū)別是什么江解?
首先我們給出標準答案:
1、Vector是線程安全的徙歼,ArrayList不是線程安全的犁河。
2、ArrayList在底層數(shù)組不夠用時在原來的基礎上擴展0.5倍魄梯,Vector是擴展1倍桨螺。
看上圖Vector和ArrayList一樣,都繼承自List酿秸,來看一下Vector的源碼
實現(xiàn)了List接口彭谁,底層和ArrayList一樣,都是數(shù)組來實現(xiàn)的允扇。分別看一下這兩個類的add方法,首先來看ArrayList的add源碼
再看Vector的add源碼
方法實現(xiàn)都一樣则奥,就是加了一個synchronized的關鍵字考润,再來看看其它方法,先看ArrayList的remove方法
再看Vector的remove方法
方法實現(xiàn)上也一樣读处,就是多了一個synchronized關鍵字糊治,再看看ArrayList的get方法
Vector的get方法
再看看Vector的其它方法
無一例外,只要是關鍵性的操作罚舱,方法前面都加了synchronized關鍵字井辜,來保證線程的安全性绎谦。當執(zhí)行synchronized修飾的方法前,系統(tǒng)會對該方法加一把鎖粥脚,方法執(zhí)行完成后釋放鎖窃肠,加鎖和釋放鎖的這個過程,在系統(tǒng)中是有開銷的刷允,因此冤留,在單線程的環(huán)境中,Vector效率要差很多树灶。(多線程環(huán)境不允許用ArrayList纤怒,需要做處理)。
至于底層數(shù)組的擴容區(qū)別天通,這里就不帶著大家讀源碼了泊窘,有興趣的朋友大家自己讀吧,底層代碼幾乎是一樣的像寒,不同的只是計算后的新數(shù)組長度不一致烘豹。
和ArrayList和Vector一樣,同樣的類似關系的類還有HashMap和HashTable萝映,StringBuilder和StringBuffer吴叶,后者是前者線程安全版本的實現(xiàn)。希望以后大家在面試過程中序臂,能說出個因為所以蚌卤,而不是一味的去背面試題,唯有理解奥秆,無需再背逊彭。
注:關于線程安全性,后續(xù)文章會說构订,這里只是簡單說這兩個類不一樣的地方侮叮。
轉(zhuǎn)載出自:https://zhuanlan.zhihu.com/p/28241176