感謝小明同學(xué)友情提供面試分享署拟,今天我們一起對面試進(jìn)行點(diǎn)評一下
首先進(jìn)行了自我介紹婉宰,幾乎每次面試的時候都會進(jìn)行自我介紹,面試的小伙伴也可以提前準(zhǔn)備一下推穷。主要從幾個方面介紹自己:
- 教育經(jīng)歷
- 工作經(jīng)歷心包,任職的公司,負(fù)責(zé)的項(xiàng)目馒铃,擔(dān)任的職責(zé)
- 自己的技術(shù)棧 (最好能包含技術(shù)點(diǎn)蟹腾,對于技術(shù)人員特別敏感的詞,引導(dǎo)面試官發(fā)問)
問題一 :介紹下感覺比較有成就感的項(xiàng)目
回答:
首先介紹了下項(xiàng)目背景(很明顯区宇,面試官并不感興趣)然后直接讓介紹在這個項(xiàng)目中最有成就感的三點(diǎn)
- 壓力很大的情況下完成了任務(wù)(感覺沒啥實(shí)質(zhì)的好處)
- 做了相關(guān)的輔助工具(感覺不是面試官關(guān)注的東西)
- 配置了完善的策略保證上線的安全
面試官沒有很好的反饋(這三點(diǎn)確實(shí)沒有突出的地方娃殖,實(shí)在不應(yīng)該這么總結(jié),應(yīng)該把性能议谷,框架改造炉爆,和解決的難題說一下)
點(diǎn)評:
首先這個問題對于社招是所有的面試中必問,也是最重要的一個環(huán)節(jié)柿隙。答好了就會對面試起到好的效果叶洞,答的不好差不多有30%的概率在面試官那已經(jīng)有了定論。所以這個環(huán)節(jié)在面試之前一定要好好的準(zhǔn)備禀崖。小明同學(xué)的回答很明顯是沒有準(zhǔn)備的衩辟。提到的三點(diǎn)幾乎完全和技術(shù)不掛鉤。面試官更想聽到的是難點(diǎn)-解決-亮點(diǎn)-技術(shù)詞匯波附。任何一個點(diǎn)出現(xiàn)艺晴,面試官都可以深入詢問來了解面試者的情況。小茗同學(xué)在這個問題上相當(dāng)于把天聊死了掸屡。
可能會有很多人說工作天天寫業(yè)務(wù)也有什么亮點(diǎn)封寞,這里我統(tǒng)一回復(fù)一下:為什么別人的項(xiàng)目有亮點(diǎn)你沒有?和項(xiàng)目無關(guān)仅财,關(guān)鍵是人自己狈究,不要讓自己的工作現(xiàn)狀成為自己不思考不總結(jié)的借口。
問題二:Object的方法有哪些
回答:
hashcode盏求,equals抖锥,toString,wait碎罚,notify磅废,finalize,getClass荆烈,clone(沒說出來)
點(diǎn)評:
題目雖然簡單拯勉,漏掉幾個也沒有什么問題。不要為了回答問題而回答問題」停回答完Object有哪些方法后岔帽,需要對各個方法進(jìn)行解釋,例如為什么這幾個方法會在Object斗遏,其中分成了幾類山卦,第一類是做什么的鞋邑,第二類是做什么的诵次,以此類推。通過這個這道題目可以引申的知識點(diǎn):
- 可以根據(jù)hashcode枚碗,equals方法引申出Map逾一,Set的實(shí)現(xiàn),equals與==的區(qū)別
- 通過wait, notify可以引申出同步等待的知識點(diǎn)肮雨,synchronized關(guān)鍵字遵堵,volatile,lock怨规,aqs陌宿,線程安全類等一系列知識點(diǎn)的展開。如果能夠進(jìn)一步結(jié)合到自己的項(xiàng)目中會更好波丰,例如項(xiàng)目中哪里為了解決什么問題使用了CountDownLatch等等壳坪。
- getClass 可以引申出Class類,進(jìn)而引出ClassLoader掰烟,整個類加載器的知識框架都可以聊爽蝴。
面對面試者的回答,面試官在自己的節(jié)奏中纫骑,一步步提問
追問:finalize方法是做什么的蝎亚?
回答:
沒有實(shí)質(zhì)的說出來finalize的用途是做什么的,我大致描述了finalize的特點(diǎn):在對象被Gc之前先馆,必然會調(diào)用finalize方法发框,使用finalize方法可以有一次拯救自己的機(jī)會,可以對該對象重新引用
點(diǎn)評:
中規(guī)中矩的回答煤墙,幾乎和書上寫的是一樣的梅惯。針對這種回答,應(yīng)該直接說明番捂,這只是Java為了對等C++的析構(gòu)函數(shù)的方法个唧,雖然可以做一些回收的工作,但是不建議使用设预。不要給面試官再次問的機(jī)會徙歼。這一塊,引出了GC居然沒有問,尷尬
追問:
見過finalize這么做的嗎魄梯?
回答:
沒有桨螺,實(shí)際項(xiàng)目中基本不會對finalize重寫,也不建議重寫(這塊對finalize的使用場景不太清楚)
追問:
equals方法和hashcode方法為什么需要同時重寫
回答:
hashMap和hashSet的數(shù)據(jù)結(jié)構(gòu)中酿秸,會先對對象進(jìn)行hashCode碼的判斷灭翔,然后在根據(jù)equals方法的判斷是否是相同對象
追問:
hashcode一樣,equals相等嗎辣苏?
回答:
不一定
追問:
equals相等肝箱,hashcode相同嗎?
回答:
相同
點(diǎn)評:
最后兩個問題稀蟋,感覺意義不大煌张,兩個方法而已,hashcode本身就是為了不碰撞退客,即便碰撞上了骏融,equals相等與否無所謂;equals相等萌狂,hashcode一定相同嗎档玻?一類個放在list中,為了判斷相等一般只會重寫equals方法茫藏,而不會重寫hashcode方法误趴。我認(rèn)為這兩個問題的場景如果是在Map中這樣的回答是正確的。
問題三:說下db中的樂觀鎖和悲觀鎖
回答:
反問了下刷允,沒太明白題目的意思(蒙了冤留,db中的樂觀鎖和悲觀鎖?這個是要問隔離級別嗎树灶?)
追問:
那說下什么是樂觀鎖纤怒,什么是悲觀鎖
回答:
樂觀鎖:在使用之前認(rèn)為該值時不會被改動的,業(yè)務(wù)執(zhí)行之后修改值的時候進(jìn)行比對
悲觀鎖:在使用之前認(rèn)為該值會被改動天通,使用之前先對其進(jìn)行加鎖
點(diǎn)評:
回答要抓重點(diǎn)泊窘,首先講什么是悲觀鎖,什么是樂觀鎖像寒,各自使用的場景是什么烘豹,結(jié)合自己的理解提出哪些地方使用了樂觀鎖,哪些地方使用了悲觀鎖诺祸。
- 樂觀鎖:認(rèn)為發(fā)生沖突的概率是非常小的携悯,所以在每次更新的時候都需要判斷原值是否發(fā)生了變化。主要應(yīng)用于數(shù)據(jù)競爭沖突小的情況筷笨。例如AQS中的CAS操作使用的就是樂觀鎖原理
- 悲觀鎖:認(rèn)為沖突發(fā)生的概率是非常大的憔鬼,如果沖突一直在發(fā)生龟劲,樂觀鎖中有的線程就會陷入饑餓狀態(tài),一直修改數(shù)據(jù)不成功轴或。針對這種情況昌跌,在出現(xiàn)競爭的地方設(shè)置鎖,每次只能有一個線程進(jìn)行操作照雁。在JAVA中synchronized蚕愤,Lock的實(shí)現(xiàn)即為悲觀鎖原理。
這樣回答中如果有面試者非常熟悉的知識點(diǎn)饺蚊,面試官就會被你的思路帶走萍诱。
追問:
說下怎么在db中使用樂觀鎖和悲觀鎖,假設(shè)db中有個庫存的列卸勺,需要進(jìn)行扣減砂沛,分別使用樂觀鎖和悲觀鎖實(shí)現(xiàn)一下
回答:
這塊我大腦蒙了烫扼,沒說出來
面試后自己回顧:
樂觀鎖實(shí)現(xiàn):在db中增加version字段曙求,讀數(shù)據(jù)把version讀出來,修改后對比version是否相同映企,相同情況下對庫存修改悟狱,并對version加1
悲觀鎖實(shí)現(xiàn):這塊可以設(shè)置新字段標(biāo)識行鎖,先更新行鎖鎖住該行堰氓,然后在讀出數(shù)據(jù)修改數(shù)值挤渐,把行鎖解除掉(感覺會引申出如果宕機(jī)了鎖沒有清掉產(chǎn)生的一直被鎖的問題)
點(diǎn)評:
這個回答也是不太好
- 樂觀鎖的實(shí)現(xiàn),version可以實(shí)現(xiàn)双絮,也可以解決樂觀鎖的ABA問題浴麻,但是在庫存這種場景下ABA問題不影響業(yè)務(wù)。首選查詢庫存為x囤攀,現(xiàn)在庫存要-1软免,直接更新庫存就可以了,只不過要在where語句中添加stock=x,整體語句為:update xxx set stock = x-1 where stock=x and id=xxxx
- 悲觀鎖焚挠,這里的思想是在數(shù)據(jù)庫中使用一個字段進(jìn)行標(biāo)志膏萧,先更新標(biāo)記位,誰更新成功誰獲取鎖蝌衔。但是這是有嚴(yán)重問題的:1是線程加鎖成功后死掉了怎么辦榛泛,該條記錄永遠(yuǎn)不能解鎖,其他線程死等噩斟?2是其他線程完全可以通過操作修改鎖狀態(tài)也就是釋放鎖曹锨,釋放鎖的線程與加鎖的線程可以不一致,這個只能通過代碼邏輯控制剃允。其實(shí)mysql中提供在在查詢的時候加 for update來加鎖沛简,保證查詢的數(shù)據(jù)不會被修改硼身,這就是db的悲觀鎖。
問題四:算法題覆享,兩個有序數(shù)組佳遂,合并
回答:
歸并,嘴說代碼
點(diǎn)評:
算法題撒顿,講對思想丑罪,分析好時間空間復(fù)雜度就可以了。如果有更好的改進(jìn)策略那就更好了凤壁。例如存在的問題:
- 遞歸吩屹,如何改成非遞歸(不會不要說,說了就是給自己挖坑)
- 歸并浪費(fèi)空間 拧抖,兩個空間需要來回導(dǎo)數(shù)據(jù)煤搜,如何避免
總結(jié)
面試本身就是面試者與面試官的交流,面試者應(yīng)該盡可能的引申出更深層次以及自己掌握度較好的知識點(diǎn)唧席,引導(dǎo)者面試官的思路進(jìn)行交流擦盾。單單一個知識領(lǐng)域(例如jvm,線程安全等等)就可以占據(jù)整個面試80%的時間淌哟,面試效果也會非常的好迹卢。反之,如果交流不暢徒仓,被面試官牽著鼻子走腐碱,問的都是自己不擅長的領(lǐng)域,那么面試基本是失敗的掉弛。大家面試也要多多總結(jié)症见,一塊學(xué)習(xí),一塊進(jìn)步殃饿。