感謝小明同學(xué)友情提供面試分享,今天我們一起對(duì)面試進(jìn)行點(diǎn)評(píng)一下
首先進(jìn)行了自我介紹,幾乎每次面試的時(shí)候都會(huì)進(jìn)行自我介紹,面試的小伙伴也可以提前準(zhǔn)備一下。主要從幾個(gè)方面介紹自己:
- 教育經(jīng)歷
- 工作經(jīng)歷,任職的公司,負(fù)責(zé)的項(xiàng)目,擔(dān)任的職責(zé)
- 自己的技術(shù)棧 (最好能包含技術(shù)點(diǎn),對(duì)于技術(shù)人員特別敏感的詞,引導(dǎo)面試官發(fā)問(wèn))
問(wèn)題一 :介紹下感覺(jué)比較有成就感的項(xiàng)目
回答:
首先介紹了下項(xiàng)目背景(很明顯,面試官并不感興趣)然后直接讓介紹在這個(gè)項(xiàng)目中最有成就感的三點(diǎn)
- 壓力很大的情況下完成了任務(wù)(感覺(jué)沒(méi)啥實(shí)質(zhì)的好處)
- 做了相關(guān)的輔助工具(感覺(jué)不是面試官關(guān)注的東西)
- 配置了完善的策略保證上線的安全
面試官?zèng)]有很好的反饋(這三點(diǎn)確實(shí)沒(méi)有突出的地方,實(shí)在不應(yīng)該這么總結(jié),應(yīng)該把性能,框架改造,和解決的難題說(shuō)一下)
點(diǎn)評(píng):
首先這個(gè)問(wèn)題對(duì)于社招是所有的面試中必問(wèn),也是最重要的一個(gè)環(huán)節(jié)。答好了就會(huì)對(duì)面試起到好的效果,答的不好差不多有30%的概率在面試官那已經(jīng)有了定論。所以這個(gè)環(huán)節(jié)在面試之前一定要好好的準(zhǔn)備。小明同學(xué)的回答很明顯是沒(méi)有準(zhǔn)備的。提到的三點(diǎn)幾乎完全和技術(shù)不掛鉤。面試官更想聽(tīng)到的是難點(diǎn)-解決-亮點(diǎn)-技術(shù)詞匯。任何一個(gè)點(diǎn)出現(xiàn),面試官都可以深入詢問(wèn)來(lái)了解面試者的情況。小茗同學(xué)在這個(gè)問(wèn)題上相當(dāng)于把天聊死了。
可能會(huì)有很多人說(shuō)工作天天寫(xiě)業(yè)務(wù)也有什么亮點(diǎn),這里我統(tǒng)一回復(fù)一下:為什么別人的項(xiàng)目有亮點(diǎn)你沒(méi)有?和項(xiàng)目無(wú)關(guān),關(guān)鍵是人自己,不要讓自己的工作現(xiàn)狀成為自己不思考不總結(jié)的借口。
問(wèn)題二:Object的方法有哪些
回答:
hashcode,equals,toString,wait,notify,finalize,getClass,clone(沒(méi)說(shuō)出來(lái))
點(diǎn)評(píng):
題目雖然簡(jiǎn)單,漏掉幾個(gè)也沒(méi)有什么問(wèn)題。不要為了回答問(wèn)題而回答問(wèn)題?;卮鹜闛bject有哪些方法后,需要對(duì)各個(gè)方法進(jìn)行解釋,例如為什么這幾個(gè)方法會(huì)在Object,其中分成了幾類,第一類是做什么的,第二類是做什么的,以此類推。通過(guò)這個(gè)這道題目可以引申的知識(shí)點(diǎn):
- 可以根據(jù)hashcode,equals方法引申出Map,Set的實(shí)現(xiàn),equals與==的區(qū)別
- 通過(guò)wait, notify可以引申出同步等待的知識(shí)點(diǎn),synchronized關(guān)鍵字,volatile,lock,aqs,線程安全類等一系列知識(shí)點(diǎn)的展開(kāi)。如果能夠進(jìn)一步結(jié)合到自己的項(xiàng)目中會(huì)更好,例如項(xiàng)目中哪里為了解決什么問(wèn)題使用了CountDownLatch等等。
- getClass 可以引申出Class類,進(jìn)而引出ClassLoader,整個(gè)類加載器的知識(shí)框架都可以聊。
面對(duì)面試者的回答,面試官在自己的節(jié)奏中,一步步提問(wèn)
追問(wèn):finalize方法是做什么的?
回答:
沒(méi)有實(shí)質(zhì)的說(shuō)出來(lái)finalize的用途是做什么的,我大致描述了finalize的特點(diǎn):在對(duì)象被Gc之前,必然會(huì)調(diào)用finalize方法,使用finalize方法可以有一次拯救自己的機(jī)會(huì),可以對(duì)該對(duì)象重新引用
點(diǎn)評(píng):
中規(guī)中矩的回答,幾乎和書(shū)上寫(xiě)的是一樣的。針對(duì)這種回答,應(yīng)該直接說(shuō)明,這只是Java為了對(duì)等C++的析構(gòu)函數(shù)的方法,雖然可以做一些回收的工作,但是不建議使用。不要給面試官再次問(wèn)的機(jī)會(huì)。這一塊,引出了GC居然沒(méi)有問(wèn),尷尬
追問(wèn):
見(jiàn)過(guò)finalize這么做的嗎?
回答:
沒(méi)有,實(shí)際項(xiàng)目中基本不會(huì)對(duì)finalize重寫(xiě),也不建議重寫(xiě)(這塊對(duì)finalize的使用場(chǎng)景不太清楚)
追問(wèn):
equals方法和hashcode方法為什么需要同時(shí)重寫(xiě)
回答:
hashMap和hashSet的數(shù)據(jù)結(jié)構(gòu)中,會(huì)先對(duì)對(duì)象進(jìn)行hashCode碼的判斷,然后在根據(jù)equals方法的判斷是否是相同對(duì)象
追問(wèn):
hashcode一樣,equals相等嗎?
回答:
不一定
追問(wèn):
equals相等,hashcode相同嗎?
回答:
相同
點(diǎn)評(píng):
最后兩個(gè)問(wèn)題,感覺(jué)意義不大,兩個(gè)方法而已,hashcode本身就是為了不碰撞,即便碰撞上了,equals相等與否無(wú)所謂;equals相等,hashcode一定相同嗎?一類個(gè)放在list中,為了判斷相等一般只會(huì)重寫(xiě)equals方法,而不會(huì)重寫(xiě)hashcode方法。我認(rèn)為這兩個(gè)問(wèn)題的場(chǎng)景如果是在Map中這樣的回答是正確的。
問(wèn)題三:說(shuō)下db中的樂(lè)觀鎖和悲觀鎖
回答:
反問(wèn)了下,沒(méi)太明白題目的意思(蒙了,db中的樂(lè)觀鎖和悲觀鎖?這個(gè)是要問(wèn)隔離級(jí)別嗎?)
追問(wèn):
那說(shuō)下什么是樂(lè)觀鎖,什么是悲觀鎖
回答:
樂(lè)觀鎖:在使用之前認(rèn)為該值時(shí)不會(huì)被改動(dòng)的,業(yè)務(wù)執(zhí)行之后修改值的時(shí)候進(jìn)行比對(duì)
悲觀鎖:在使用之前認(rèn)為該值會(huì)被改動(dòng),使用之前先對(duì)其進(jìn)行加鎖
點(diǎn)評(píng):
回答要抓重點(diǎn),首先講什么是悲觀鎖,什么是樂(lè)觀鎖,各自使用的場(chǎng)景是什么,結(jié)合自己的理解提出哪些地方使用了樂(lè)觀鎖,哪些地方使用了悲觀鎖。
- 樂(lè)觀鎖:認(rèn)為發(fā)生沖突的概率是非常小的,所以在每次更新的時(shí)候都需要判斷原值是否發(fā)生了變化。主要應(yīng)用于數(shù)據(jù)競(jìng)爭(zhēng)沖突小的情況。例如AQS中的CAS操作使用的就是樂(lè)觀鎖原理
- 悲觀鎖:認(rèn)為沖突發(fā)生的概率是非常大的,如果沖突一直在發(fā)生,樂(lè)觀鎖中有的線程就會(huì)陷入饑餓狀態(tài),一直修改數(shù)據(jù)不成功。針對(duì)這種情況,在出現(xiàn)競(jìng)爭(zhēng)的地方設(shè)置鎖,每次只能有一個(gè)線程進(jìn)行操作。在JAVA中synchronized,Lock的實(shí)現(xiàn)即為悲觀鎖原理。
這樣回答中如果有面試者非常熟悉的知識(shí)點(diǎn),面試官就會(huì)被你的思路帶走。
追問(wèn):
說(shuō)下怎么在db中使用樂(lè)觀鎖和悲觀鎖,假設(shè)db中有個(gè)庫(kù)存的列,需要進(jìn)行扣減,分別使用樂(lè)觀鎖和悲觀鎖實(shí)現(xiàn)一下
回答:
這塊我大腦蒙了,沒(méi)說(shuō)出來(lái)
面試后自己回顧:
樂(lè)觀鎖實(shí)現(xiàn):在db中增加version字段,讀數(shù)據(jù)把version讀出來(lái),修改后對(duì)比version是否相同,相同情況下對(duì)庫(kù)存修改,并對(duì)version加1
悲觀鎖實(shí)現(xiàn):這塊可以設(shè)置新字段標(biāo)識(shí)行鎖,先更新行鎖鎖住該行,然后在讀出數(shù)據(jù)修改數(shù)值,把行鎖解除掉(感覺(jué)會(huì)引申出如果宕機(jī)了鎖沒(méi)有清掉產(chǎn)生的一直被鎖的問(wèn)題)
點(diǎn)評(píng):
這個(gè)回答也是不太好
- 樂(lè)觀鎖的實(shí)現(xiàn),version可以實(shí)現(xiàn),也可以解決樂(lè)觀鎖的ABA問(wèn)題,但是在庫(kù)存這種場(chǎng)景下ABA問(wèn)題不影響業(yè)務(wù)。首選查詢庫(kù)存為x,現(xiàn)在庫(kù)存要-1,直接更新庫(kù)存就可以了,只不過(guò)要在where語(yǔ)句中添加stock=x,整體語(yǔ)句為:update xxx set stock = x-1 where stock=x and id=xxxx
- 悲觀鎖,這里的思想是在數(shù)據(jù)庫(kù)中使用一個(gè)字段進(jìn)行標(biāo)志,先更新標(biāo)記位,誰(shuí)更新成功誰(shuí)獲取鎖。但是這是有嚴(yán)重問(wèn)題的:1是線程加鎖成功后死掉了怎么辦,該條記錄永遠(yuǎn)不能解鎖,其他線程死等?2是其他線程完全可以通過(guò)操作修改鎖狀態(tài)也就是釋放鎖,釋放鎖的線程與加鎖的線程可以不一致,這個(gè)只能通過(guò)代碼邏輯控制。其實(shí)mysql中提供在在查詢的時(shí)候加 for update來(lái)加鎖,保證查詢的數(shù)據(jù)不會(huì)被修改,這就是db的悲觀鎖。
問(wèn)題四:算法題,兩個(gè)有序數(shù)組,合并
回答:
歸并,嘴說(shuō)代碼
點(diǎn)評(píng):
算法題,講對(duì)思想,分析好時(shí)間空間復(fù)雜度就可以了。如果有更好的改進(jìn)策略那就更好了。例如存在的問(wèn)題:
- 遞歸,如何改成非遞歸(不會(huì)不要說(shuō),說(shuō)了就是給自己挖坑)
- 歸并浪費(fèi)空間 ,兩個(gè)空間需要來(lái)回導(dǎo)數(shù)據(jù),如何避免
總結(jié)
面試本身就是面試者與面試官的交流,面試者應(yīng)該盡可能的引申出更深層次以及自己掌握度較好的知識(shí)點(diǎn),引導(dǎo)者面試官的思路進(jìn)行交流。單單一個(gè)知識(shí)領(lǐng)域(例如jvm,線程安全等等)就可以占據(jù)整個(gè)面試80%的時(shí)間,面試效果也會(huì)非常的好。反之,如果交流不暢,被面試官牽著鼻子走,問(wèn)的都是自己不擅長(zhǎng)的領(lǐng)域,那么面試基本是失敗的。大家面試也要多多總結(jié),一塊學(xué)習(xí),一塊進(jìn)步。