求求大廠給個Offer:List面試題

前言

微信搜【Java3y】關注這個有夢想的男人才顿,點贊關注是對我最大的支持勇婴!

文本已收錄至我的GitHubhttps://github.com/ZhongFuCheng3y/3y,有300多篇原創(chuàng)文章盆偿,最近在連載面試系列求橄!

從今天開始灵巧,我欢搜,三歪,正式開始寫面試系列滚局。我給這個面試系列取了一個名字,叫做《求求大廠給個Offer》

上一篇就叫做《求求大廠給個Offer:如何寫簡歷》

所以這篇文章叫做《求求大廠給個Offer:List面試題》

接下來就開始吧嘁圈。

本文有配套的視頻觀看:https://www.bilibili.com/video/BV1nT4y1L71r/ 歡迎三連最住。

面試現(xiàn)場

面試官:“你先簡單自我介紹吧涨缚∨海”

三歪:“我叫三歪茂翔,目前維護一個公眾號叫做Java3y惭嚣,這幾年寫了300+原創(chuàng)技術文章晚吞,近1000頁的原創(chuàng)電子書和多個知識點的思維導圖载矿。我的愿景是:只要關注我并三連的同學都可以拿到大廠offer。我的....”

面試官:“停停停逢勾,別吹了溺拱,我們正式開始吧迫摔【湔迹”

面試官:“來講講Java的List吧,你對List了解多少擂啥?”

三歪:“List在Java里邊是一個接口哺壶,常見的實現(xiàn)類有ArrayList和LinkedList山宾,在開發(fā)中用得最多的是ArrayList”

面試官:“你再分別來講講ArrayList和LinkedList的區(qū)別唄”

三歪:“ArrayList的底層數據結構是數組渊胸,LinkedList底層數據結構是鏈表。”

面試官:“那我們本身就有數組了萨咳,為什么要用ArrayList呢鹃两?”

三歪:“原生的數組會有一個特點:你在使用的時候必須要為它創(chuàng)建大小俊扳,而ArrayList不用”

面試官:“那你說說ArrayList是怎么實現(xiàn)的吧,為什么ArrayList就不用創(chuàng)建大小呢懊烤?”

三歪:“其實是這樣的茸习,我看過源碼逮光。當我們new ArrayList()的時候涕刚,默認會有一個空的Object數組,大小為0驾茴。當我們第一次add添加數據的時候锈至,會給這個數組初始化一個大小峡捡,這個大小默認值為10”

面試官:“嗯”

三歪:“還有就是稍途,數組的大小是固定的械拍,而ArrayList的大小是可變的”

面試官:“那怎么理解固定和可變的呢坷虑?你說說看”

三歪:“假設我們給定數組的大小是10,要往這個數組里邊填充元素海蔽,我們只能添加10個元素党窜。而ArrayList不一樣幌衣,ArrayList我們在使用的時候可以往里邊添加20個,30個楚里,甚至更多的元素”

三歪:“因為ArrayList是實現(xiàn)了動態(tài)擴容的”

面試官:“那它是怎么實現(xiàn)的呢班缎?”

三歪:“使用ArrayList在每一次add的時候,它都會先去計算這個數組夠不夠空間趁耗,如果空間是夠的满葛,那直接追加上去就好了纱扭。如果不夠乳蛾,那就得擴容”

面試官:“那怎么擴容?一次擴多少因惭?”

三歪:“在源碼里邊,有個grow方法姻成,每一次擴原來的1.5倍低缩。比如說咆繁,初始化的值是10嘛⊥姘悖現(xiàn)在我第11個元素要進來了,發(fā)現(xiàn)這個數組的空間不夠了久脯,所以會擴到15”

三歪:“空間擴完容之后帘撰,會調用arraycopy來對數組進行拷貝”

面試官:“哦摧找,可以的芝雪。那為什么你在前面提到惩系,在日常開發(fā)中用得最多的是ArrayList呢堡牡?”

三歪:“是由底層的數據結構來決定的,在日常開發(fā)中芥颈,遍歷的需求比增刪要多浇借,即便是增刪也是往往在List的尾部添加就OK了妇垢。像在尾部添加元素,ArrayList的時間復雜度也就O(1)

三歪:“另外的是涨薪,ArrayList的增刪底層調用的copyOf()被優(yōu)化過刚夺,現(xiàn)代CPU對內存可以塊操作侠姑,ArrayList的增刪一點兒也不會比LinkedList慢”

面試官:“Vector你了解嗎?”

三歪:“嗯安吁,Vector是底層結構是數組网棍,一般現(xiàn)在我們已經很少用了滥玷。相對于ArrayList,它是線程安全的拉盾,在擴容的時候它是直接擴容兩倍的,比如現(xiàn)在有10個元素夭禽,要擴容的時候讹躯,就會將數組的大小增長到20”

面試官:“嗯潮梯,那如果我們不用Vector,線程安全的List還有什么萝究?”

三歪:“首先帆竹,我們也可以用Collections來將ArrayList來包裝一下馆揉,變成線程安全舷暮。但這肯定不是你想聽的下面,對吧沥割。在java.util.concurrent包下還有一個類,叫做CopyOnWriteArrayList”

面試官:“嗯椒拗,你繼續(xù)說”

三歪:“要講CopyOnWriteArrayList之前蚀苛,我還是想說說copy-on-write這個意思堵未,下面我會簡稱為cow。比如說在Linux中拙徽,我們知道所有的進程都是init進程fork出來的膘怕,除了進程號之外岛心,fork出來的進程,默認跟父進程一模一樣的髓堪。在fork之后exec之前干旁,兩個進程用的是相同的內存空間的争群,這意味著子進程的代碼段玉雾、數據段复旬、堆棧都是指向父進程的物理空間”

面試官:“嗯”

三歪:“當父子進程中有更改的行為發(fā)生時驹碍,再為子進程分配相應物理空間幸冻。這樣做的好處就是,等到真正發(fā)生修改的時候革半,才去分配資源,可以減少分配或者復制大量資源時帶來的瞬間延時漫试。簡單來說外构,就可以理解為我們的懶加載审编,或者說單例模式的懶漢式垒酬。等真正用到的時候再分配”

面試官:“嗯”

三歪:“在文件系統(tǒng)中矮湘,其實也有cow的機制板祝。文件系統(tǒng)的cow就是在修改數據的時候,不會直接在原來的數據位置上進行操作橘洞,而是重新找個位置修改炸枣。比如說:要修改數據塊A的內容适肠,先把A讀出來,寫到B塊里面去澄干。如果這時候斷電了辩稽,原來A的內容還在逞泄。這樣做的好處就是可以保證數據的完整性喷众,瞬間掛掉了容易恢復侮腹。

三歪:“再回頭來看CopyOnWriteArrayList吧愈涩,CopyOnWriteArrayList是一個線程安全的List履婉,底層是通過復制數組的方式來實現(xiàn)的毁腿。

三歪:“我來說說它 的add()方法的實現(xiàn)吧”

面試官:“好”

三歪:“在add()方法其實他會加lock鎖,然后會復制出一個新的數組胯究,往新的數組里邊add真正的元素裕循,最后把array的指向改變?yōu)樾碌臄到M”

三歪:“其實get()方法又或是size()方法只是獲取array所指向的數組的元素或者大小。讀不加鎖株婴,寫加鎖”

三歪:“可以發(fā)現(xiàn)的是督暂,CopyOnWriteArrayList跟文件系統(tǒng)的COW機制是很像的”

面試官:“那你能說說CopyOnWriteArrayList有什么缺點嗎饥努?”

三歪:“很顯然驾诈,CopyOnWriteArrayList是很耗費內存的乍迄,每次set()/add()都會復制一個數組出來闯两,另外就是CopyOnWriteArrayList只能保證數據的最終一致性重慢,不能保證數據的實時一致性似踱。假設兩個線程,線程A去讀取CopyOnWriteArrayList的數據狞洋,還沒讀完吉懊,現(xiàn)在線程B把這個List給清空了借嗽,線程A此時還是可以把剩余的數據給讀出來〔沂伲”

面試官:“嗯,還可以删窒,今天的面試就到這里結束了裂垦,你有什么想問我的嗎?”

三歪:“你覺得我今天的表現(xiàn)怎么樣肌索?”

面試官:“今天的表現(xiàn)還可以蕉拢,如果這一次你沒有100個點贊,估計HR就不會再聯(lián)系你了诚亚。如果超過100個點贊晕换,第二輪好好表現(xiàn)吧夷家。”

面試官:“給你透露一下,Map集合可以好好準備一下,下一輪將會考察Map的知識”

題外話

List集合總體來說不會太難,但CopyOnWriteArrayList可能很多同學還不知道有這么一個類所踊。

針對這次的面試可能你想了解更多List的細節(jié)继薛,比如說ArrayList/LinkedList/CopyOnWriteArrayList的源碼以及上面提到的COW機制诈皿,可以在公眾號下回復「List」即可獲取我之前寫的原創(chuàng)文章胖腾。

需要預習或者領取電子書的同學,在公眾號下回復「888」即可獲取。

本文有配套的視頻觀看:https://www.bilibili.com/video/BV1nT4y1L71r/ 歡迎三連郑趁。

涵蓋Java后端所有知識點的開源項目舅柜,已有10K+ star瞬沦!內含1000+頁原創(chuàng)電子書!A履辍区拳!

PDF文檔的內容均為手打业汰,有任何的不懂都可以直接來問我

image
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纽疟,隨后出現(xiàn)的幾起案子蟆肆,更是在濱河造成了極大的恐慌州藕,老刑警劉巖待牵,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缩功,居然都是意外死亡,警方通過查閱死者的電腦和手機板驳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲫寄,“玉大人蜡秽,你說我怎么就攤上這事∥舾” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵法希,是天一觀的道長趁桃。 經常有香客問我,道長冻河,這世上最難降的妖魔是什么刹悴? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮健盒,結果婚禮上烁焙,老公的妹妹穿的比我還像新娘虑鼎。我一直安慰自己,他們只是感情好独旷,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布速那。 她就那樣靜靜地躺著诺擅,像睡著了一般谋币。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天垫毙,我揣著相機與錄音屠阻,去河邊找鬼缸逃。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的摘盆。 我是一名探鬼主播翼雀,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骡澈!你這毒婦竟也來了锅纺?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肋殴,失蹤者是張志新(化名)和其女友劉穎囤锉,沒想到半個月后坦弟,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡官地,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年酿傍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驱入。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡赤炒,死狀恐怖,靈堂內的尸體忽然破棺而出亏较,到底是詐尸還是另有隱情莺褒,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布雪情,位于F島的核電站遵岩,受9級特大地震影響,放射性物質發(fā)生泄漏巡通。R本人自食惡果不足惜尘执,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宴凉。 院中可真熱鬧誊锭,春花似錦、人聲如沸弥锄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叉讥。三九已至窘行,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間图仓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工但绕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留救崔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓捏顺,卻偏偏與公主長得像六孵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子幅骄,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355