網(wǎng)易一面
Java基礎(chǔ)
-
簡單介紹一下Object中的方法:
用于線程通信的wait涝开、notify和notifyAll方法潮售,說明了各方法的作用;
用于拷貝對象的clone方法碰镜,可以實現(xiàn)深拷貝逃呼;
用于垃圾回收機制中對象在被回收前調(diào)用的finalize方法鳖孤,用于讓對象自我拯救,避免被回收抡笼;
用于判斷對象相等性的equals方法苏揣,默認實現(xiàn)是使用
==
判斷兩個對象引用指向的地址是否相同;
然后深入問了equals和hashCode方法的關(guān)系推姻。
-
重寫equals方法需要滿足的5個特性(Effective Java中有平匈,寫的時候才tm想起來)?
自反性:對任一引用值x藏古,x.equals(x)的返回值一定返回true增炭;
對稱性:對于任意引用值x,y拧晕,當且僅當y.equals(x)返回true時隙姿,x.equals(y)才返回true;
傳遞性:如果x.equals(y) == true厂捞,y.equals(z) == true输玷,則x.equals(z) == true;
一致性:如果參與比較的對象沒任何改變蔫敲,則對象比較的結(jié)果也不應(yīng)該有任何改變饲嗽;
非空性:對于任意非空引用值x炭玫,x.equals(null)一定返回false奈嘿。
-
為什么重寫equals方法,還必須要重寫hashCode方法吞加?
如果只重寫equals而不重寫hashCode會違反Object.hashCode約定的第二條:相等的對象必須有相等的散列碼裙犹。通常會導致基于散列的集合類無法正常運作尽狠,如HashMap、HashSet和Hashtable叶圃。
-
只重寫hashCode而不重寫equals方法可以嗎袄膏?
(不可以吧。不重寫equals方法掺冠,還是默認的使用
==
判斷地址是否相同呀沉馆,重寫了hashCode方法又有什么用。)
沒找到
集合
-
如何找到兩個 List 的交集德崭?如何找到兩個 List 的差集斥黑?如何找到兩個 List 的并集?
求交集:list.retainAll(list2)眉厨;
求差集:list1.removeAll(list2)锌奴;
求并集:list1.addAll(list2)。
JVM
-
使用
class ClassName
聲明一個類憾股,不顯式地指明extends Object
是怎么保證這個類的基類是 Object 的呢鹿蜀?不是默認的嗎?(面試官:是什么機制實現(xiàn)這種效果的服球?)
沒找到茴恰。《深入理解Java虛擬機》 P231 類加載器機制斩熊?琐簇??
-
Java中使用的類加載機制是雙親委派機制座享,請闡述一下雙親委派機制婉商?
如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類渣叛,而是把這個請求委派給父類加載器去完成丈秩,每一個層次的類加載器都是如此,因此所有的類加載請求都應(yīng)該傳送到頂層的啟動類加載器中淳衙,只有當父類加載器反饋自己無法完成這個加載請求時蘑秽,子類加載器才會嘗試自己去加載。
-
可以手動編寫代碼來指定使用
Bootstrap ClassLoader啟動類加載器
來加載類嗎箫攀?為什么不可以肠牲?自己有嘗試著寫過類加載器嗎?
不可以靴跛。
Bootstrap ClassLoader啟動類加載器
是由C++實現(xiàn)缀雳,是虛擬機的一部分,啟動加載器無法被Java程序直接引用梢睛,用戶編寫類加載器需要把加載請求委托給引導類加載器時肥印,直接使用null即可识椰,JVM會默認使用啟動類加載器進行加載;而其他的類加載器皆由Java實現(xiàn)深碱、獨立于虛擬機腹鹉,全都繼承自抽象類java.lang.ClassLoader
。同時也是為了安全敷硅。
-
當你的程序占用CPU過高的時候功咒,你要怎么進行調(diào)試,說一下你的思路绞蹦?
首先航瞭,當察覺到系統(tǒng)明顯異常的時候,使用
top
命令查看當前系統(tǒng)資源占用情況坦辟,然后使用jstack
命令查看進程內(nèi)部狀態(tài)來定位問題刊侯,然后到源碼中查找問題。
https://blog.csdn.net/tyjlearning/article/details/82182826
使用
top
命令查看系統(tǒng)資源占用情況锉走,定位到占用CPU資源過高的進程ID滨彻;-
通過
ps -mp <PID> -o THREAD,tid,time
命令查看該進程內(nèi)部的線程信息,tid表示線程ID挪蹭,time表示線程的已運行時間亭饵,定位到進程內(nèi)占用CPU資源過高的線程ID;ps p|-p|--pid <PID>
顯示ID為PID
的進程信息梁厉;ps -m <PID>
顯示ID為PID
的進程下所有的線程信息辜羊;ps -mp <PID> -o THREAD,tid,time
中的-o THREAD,tid,time
用來指定顯示格式。
通過
printf "%x\n" <TID>
命令將tid轉(zhuǎn)化為十六進制词顾,方便后續(xù)使用jstack
工具查看進程堆棧信息(之所以拿到TID信息八秃,是為了查找方便);使用
jstack <PID>
命令查看進程堆棧信息肉盹;最后根據(jù)堆棧信息昔驱,到源碼中排查問題。
-
當你的程序創(chuàng)建線程的數(shù)量過多時上忍,你要怎么進行調(diào)試骤肛,說一下你的思路?
同問題4窍蓝。
多線程
-
創(chuàng)建線程有哪些方法腋颠?
實現(xiàn) Runnable 接口,并實現(xiàn) run 方法吓笙,然后將該類作為
new Thread()
的參數(shù)傳入淑玫,調(diào)用 Thread 類的 start 方法來實際創(chuàng)建一個線程;繼承 Thread 類,并重寫 run 方法混移, 然后調(diào)用該類的 start 方法來實際創(chuàng)建一個線程;
實現(xiàn) Callable 接口侮穿,并重寫 call 方法( 該方法可以讓我們在執(zhí)行完任務(wù)之后獲取執(zhí)行結(jié)果歌径,通過 FutureTask 的 get 方法獲得該結(jié)果),然后將該類作為
new FutureTask()
的參數(shù)傳入亲茅,再將得到的 FutureTask 作為new Thread()
的參數(shù)傳入 回铛,調(diào)用 Thread 類的 start 方法實際創(chuàng)建一個線程。
-
線程池可以幫助我們避免頻繁地創(chuàng)建銷毀線程帶來必要的開銷克锣。Java 實現(xiàn)了哪幾種線程池茵肃?闡述一下他們的應(yīng)用場景?
SingleThreadExecutor 創(chuàng)建一個單線程化的線程池袭祟,它只能創(chuàng)建唯一的一個工作線程(搭配無界隊列)來執(zhí)行任務(wù)验残,在需要保證任務(wù)按照指定順序(FIFO、LIFO和優(yōu)先級)執(zhí)行的場景中使用巾乳;
FixedThreadPool 創(chuàng)建一個定容線程池您没,可控制線程最大并發(fā)數(shù),超出的線程會在隊列中等待胆绊,適用于系統(tǒng)資源有限或者同一時間段內(nèi)任務(wù)執(zhí)行數(shù)有限制的場景氨鹏;
CachedThreadPool 創(chuàng)建一個可緩存線程池,如果線程池長度超過處理需要压状,可靈活回收空閑線程仆抵,若無可回收線程,則新建線程种冬,適用于執(zhí)行時間短并且數(shù)量多的場景镣丑;
ScheduledThreadPool 創(chuàng)建一個定長線程池,支持定時和周期性任務(wù)執(zhí)行娱两,適用于定時和周期性執(zhí)行任務(wù)的場景传轰。
-
當線程池和阻塞隊列中都不能容納更多的線程時,需要使用飽和策略機制來處理后續(xù)提交的任務(wù)谷婆,請問飽和策略機制有哪些慨蛙?
AbortPolicy 直接拋出異常
CallerRunsPolicy 由調(diào)用者所在線程來運行任務(wù)
DiscardOldestPolicy 丟棄隊列中末尾的一個任務(wù)赁咙,并執(zhí)行當前任務(wù)
DiscardPolicy 不處理胞得,直接丟棄
設(shè)計模式
-
介紹一下適配器模式和門面模式(還有代理模式)骂铁?他們各自的應(yīng)用場景滑肉?
-
門面模式為子系統(tǒng)中的一組接口提供一個高層接口疯坤,簡化系統(tǒng)的使用:
優(yōu)點是低耦合度液,被調(diào)模塊更容易擴展和維護卑硫;簡單易用前域,節(jié)省了調(diào)用者的處理流程,更好地劃分了訪問層次封孙;用戶不知道內(nèi)部實現(xiàn)迹冤,提高了安全性;
缺點是不符合開閉原則虎忌,如果新增功能泡徙,繼承復用都沒有用,只能修改門面模塊代碼膜蠢;
適用場景是可以隱藏復雜的實現(xiàn)步驟堪藐,維護舊系統(tǒng)的時候,可以封裝遺留代碼挑围,提供清晰接口礁竞。
-
適配器模式將一個接口轉(zhuǎn)換成客戶希望的另一個接口,使得原本接口不兼容的類可以協(xié)同工作:
優(yōu)點是將適配器類和目標類解耦杉辙,增加了類的透明性模捂,靈活性拓展性好;
缺點是Java只支持單繼承蜘矢,所以一個類只能適配一個適配器類枫绅;
適用場景是當系統(tǒng)的數(shù)據(jù)和行為都正常,只有接口不匹配時硼端,可以使用適配器模式并淋。
-
代理模式為其他對象提供一種代理以控制對這個對象的訪問,客戶訪問不到這個對象珍昨,可以通過代理間接訪問:
優(yōu)點是協(xié)調(diào)調(diào)用者與被調(diào)用者县耽,實現(xiàn)部分解耦;能夠在代理層對調(diào)用者進行保護镣典;
缺點是增加代理層兔毙,使得調(diào)用流程復雜,可能出錯兄春,還會導致處理速度變慢澎剥;
適用場景是遠程訪問,虛擬代理赶舆,以及權(quán)限控制等哑姚。
-
-
介紹一下裝飾模式和代理模式?
- 裝飾模式可以動態(tài)地增加被裝飾者的行為芜茵;
-
介紹一下MVC用了哪些設(shè)計模式叙量?
視圖層和模型層使用了觀察者模式:當模型層的數(shù)據(jù)更新時,視圖層可以及時自動更新九串;
視圖層使用組合模式來嵌套子視圖绞佩;
控制層使用策略模式來根據(jù)需要綁定相應(yīng)的視圖寺鸥。
Spring
-
Spring中事務(wù)的傳播機制?
Spring事務(wù)定義了七種傳播行為:
數(shù)據(jù)庫
-
什么樣的字段適合作為索引品山?
頻繁出現(xiàn)在where條件語句中的字段胆建;
關(guān)聯(lián)字段需要建立索引,例如外鍵字段肘交;
排序字段可以建立索引笆载;
分組字段可以建立索引;
統(tǒng)計字段可以建立索引酸些,如count(), max()等宰译;
-
什么樣的字段不能作為索引檐蚜?
數(shù)據(jù)量可以確定比較少(300行以下)的表不需要建立索引魄懂;
不會出現(xiàn)在where條件語句中的字段;
頻繁更新的字段闯第;
數(shù)據(jù)重復且分布比較均勻的字段(唯一性太差的字段)市栗,如性別、真假值咳短;
參與列計算的字段填帽。
-
如果一個表中的記錄達到了千萬級別,應(yīng)該采用哪種拆分機制進行拆分咙好?
隨著表中記錄數(shù)的增大篡腌,查詢的效率會越來越低。應(yīng)該采用水平分表機制來對表的行數(shù)進行拆分勾效,以此來降低查詢時需要讀的數(shù)據(jù)和索引的頁數(shù)嘹悼,同時也可以降低索引的層數(shù),提高查詢效率层宫。
切分原則:增量區(qū)間杨伙、散列或其他業(yè)務(wù)邏輯。使用哪種切分原則要根據(jù)實際業(yè)務(wù)邏輯判斷:比如對表的訪問多是近期產(chǎn)生的新數(shù)據(jù)萌腿,歷史數(shù)據(jù)訪問較少限匣,可以考慮根據(jù)時間增量把數(shù)據(jù)按照一定時間段(比如每天)切分。如果對表的訪問較均勻毁菱,沒有明顯的熱點區(qū)域米死,則可以考慮用范圍(比如每500w一個表)或普通Hash或一致性Hash來切分。
API設(shè)計
-
要實現(xiàn)一個搶紅包的功能贮庞,需要對外提供接口哲身,該如何設(shè)計此接口?
要多維度考慮贸伐】碧欤考慮安全、性能等等。
沒找到
總結(jié)與感悟
對數(shù)據(jù)庫脯丝、Spring等基礎(chǔ)知識點掌握較為薄弱商膊;
項目較為簡單,沒有什么亮點可以吸引面試官宠进;
簡歷內(nèi)容過于寬泛晕拆,不利于引導面試官進行提問,結(jié)果就是很容易被問到自己的掌握不好的點材蹬;
一些復習過的點回答的也不太好实幕,應(yīng)該多看多思考,加深理解堤器。