Java深入源碼級(jí)面試題

Java深入源碼級(jí)面試題

長(zhǎng)沙達(dá)內(nèi)教育      2022-03-28 23:00:02     12

Java深入源碼級(jí)面試題,  1、哪些情況下的對(duì)象會(huì)被垃圾回收機(jī)制處理掉?  利用可達(dá)性分析算法,虛擬機(jī)會(huì)將一些對(duì)象定義為GCRoots,從GCRoots出發(fā)沿

課程價(jià)格 請(qǐng)咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹



  1、哪些情況下的對(duì)象會(huì)被垃圾回收機(jī)制處理掉?


  利用可達(dá)性分析算法,虛擬機(jī)會(huì)將一些對(duì)象定義為GCRoots,從GCRoots出發(fā)沿著引用鏈向下尋找,如果某個(gè)對(duì)象不能通過(guò)GCRoots尋找到,虛擬機(jī)就認(rèn)為該對(duì)象可以被回收掉。


  1.1哪些對(duì)象可以被看做是GCRoots呢?


  1)虛擬機(jī)棧(棧幀中的本地變量表)中引用的對(duì)象;


  2)方法區(qū)中的類(lèi)靜態(tài)屬性引用的對(duì)象,常量引用的對(duì)象;


  3)本地方法棧中JNI(Native方法)引用的對(duì)象;


  1.2對(duì)象不可達(dá),一定會(huì)被垃圾收集器回收么?


  即使不可達(dá),對(duì)象也不一定會(huì)被垃圾收集器回收


  1)先判斷對(duì)象是否有必要執(zhí)行finalize()方法,對(duì)象必須重寫(xiě)finalize()方法且沒(méi)有被運(yùn)行過(guò)。


  2)若有必要執(zhí)行,會(huì)把對(duì)象放到一個(gè)隊(duì)列中,JVM會(huì)開(kāi)一個(gè)線程去回收它們,這是對(duì)象最后一次可以逃逸清理的機(jī)會(huì)。


  2、講一下常見(jiàn)編碼方式?


  編碼的意義:計(jì)算機(jī)中存儲(chǔ)的最小單元是一個(gè)字節(jié)即8bit,所能表示的字符范圍是255個(gè),而人類(lèi)要表示的符號(hào)太多,無(wú)法用一個(gè)字節(jié)來(lái)完全表示,固需要將符號(hào)編碼,將各種語(yǔ)言翻譯成計(jì)算機(jī)能懂的語(yǔ)言。


  1)ASCII碼:


  總共128個(gè),用一個(gè)字節(jié)的低7位表示,0?31控制字符如換回車(chē)刪除等;32~126是打印字符,可通過(guò)鍵盤(pán)輸入并顯示出來(lái);


  2)ISO-8859-1


  用來(lái)擴(kuò)展ASCII編碼,256個(gè)字符,涵蓋了大多數(shù)西歐語(yǔ)言字符。


  3)GB2312


  雙字節(jié)編碼,總編碼范圍是A1-A7,A1-A9是符號(hào)區(qū),包含682個(gè)字符,B0-B7是漢字區(qū),包含6763個(gè)漢字;


  4)GBK


  為了擴(kuò)展GB2312,加入了更多的漢字,編碼范圍是8140~FEFE,有23940個(gè)碼位,能表示21003個(gè)漢字。


  5)UTF-16


  ISO試圖想創(chuàng)建一個(gè)全新的超語(yǔ)言字典,世界上所有語(yǔ)言都可通過(guò)這本字典Unicode來(lái)相互翻譯,而UTF-16定義了Unicode字符在計(jì)算機(jī)中存取方法,用兩個(gè)字節(jié)來(lái)表示Unicode轉(zhuǎn)化格式。不論什么字符都可用兩字節(jié)表示,即16bit,固叫UTF-16。


  6)UTF-8:


  UTF-16統(tǒng)一采用兩字節(jié)表示一個(gè)字符,但有些字符只用一個(gè)字節(jié)就可表示,浪費(fèi)存儲(chǔ)空間,而UTF-8采用一種變長(zhǎng)技術(shù),每個(gè)編碼區(qū)域有不同的字碼長(zhǎng)度。不同類(lèi)型的字符可以由1~6個(gè)字節(jié)組成。


  3、utf-8編碼中的中文占幾個(gè)字節(jié);int型幾個(gè)字節(jié)?


  utf-8是一種變長(zhǎng)編碼技術(shù),utf-8編碼中的中文占用的字節(jié)不確定,可能2個(gè)、3個(gè)、4個(gè),int型占4個(gè)字節(jié)。


  4、靜態(tài)代理和動(dòng)態(tài)代理的區(qū)別,什么場(chǎng)景使用?


  代理是一種常用的設(shè)計(jì)模式,


  目的是:


  為其他對(duì)象提供一個(gè)代理以控制對(duì)某個(gè)對(duì)象的訪問(wèn),將兩個(gè)類(lèi)的關(guān)系解耦。代理類(lèi)和委托類(lèi)都要實(shí)現(xiàn)相同的接口,因?yàn)榇碚嬲{(diào)用的是委托類(lèi)的方法。


  區(qū)別:


  1)靜態(tài)代理:


  由程序員創(chuàng)建或是由特定工具生成,在代碼編譯時(shí)就確定了被代理的類(lèi)是哪一個(gè)是靜態(tài)代理。靜態(tài)代理通常只代理一個(gè)類(lèi);


  2)動(dòng)態(tài)代理:


  在代碼運(yùn)行期間,運(yùn)用反射機(jī)制動(dòng)態(tài)創(chuàng)建生成。動(dòng)態(tài)代理代理的是一個(gè)接口下的多個(gè)實(shí)現(xiàn)類(lèi);


  實(shí)現(xiàn)步驟:


  a.實(shí)現(xiàn)InvocationHandler接口創(chuàng)建自己的調(diào)用處理器;


  b.給Proxy類(lèi)提供ClassLoader和代理接口類(lèi)型數(shù)組創(chuàng)建動(dòng)態(tài)代理類(lèi);


  c.利用反射機(jī)制得到動(dòng)態(tài)代理類(lèi)的構(gòu)造函數(shù);


  d.利用動(dòng)態(tài)代理類(lèi)的構(gòu)造函數(shù)創(chuàng)建動(dòng)態(tài)代理類(lèi)對(duì)象;


  使用場(chǎng)景:


  Retrofit中直接調(diào)用接口的方法;Spring的AOP機(jī)制;


  5、Java的異常體系


  Java中Throwable是所有異常和錯(cuò)誤的超類(lèi),兩個(gè)直接子類(lèi)是Error(錯(cuò)誤)和Exception(異常):


  1)Error是程序無(wú)法處理的錯(cuò)誤,由JVM產(chǎn)生和拋出


  如OOM、ThreadDeath等。這些異常發(fā)生時(shí),JVM一般會(huì)選擇終止程序。


  2)Exception是程序本身可以處理的異常


  又分為運(yùn)行時(shí)異常(RuntimeException)(也叫CheckedEception)和非運(yùn)行時(shí)異常(不檢查異常UncheckedException)。


  運(yùn)行時(shí)異常


  有NullPointerExceptionIndexOutOfBoundsException等,這些異常一般是由程序邏輯錯(cuò)誤引起的,應(yīng)盡可能避免。


  非運(yùn)行時(shí)異常


  有IOExceptionSQLExceptionFileNotFoundException以及由用戶自定義的Exception異常等。


  6、談?wù)勀銓?duì)解析與分派的認(rèn)識(shí)。


  解析


  指方法在運(yùn)行前,即編譯期間就可知的,有一個(gè)確定的版本,運(yùn)行期間也不會(huì)改變。解析是靜態(tài)的,在類(lèi)加載的解析階段就可將符號(hào)引用轉(zhuǎn)變成直接引用。


  分派


  可分為靜態(tài)分派和動(dòng)態(tài)分派,重載屬于靜態(tài)分派,覆蓋屬于動(dòng)態(tài)分派。


  靜態(tài)分派是指在重載時(shí)通過(guò)參數(shù)的靜態(tài)類(lèi)型而非實(shí)際類(lèi)型作為判斷依據(jù),在編譯階段,編譯器可根據(jù)參數(shù)的靜態(tài)類(lèi)型決定使用哪一個(gè)重載版本。


  動(dòng)態(tài)分派則需要根據(jù)實(shí)際類(lèi)型來(lái)調(diào)用相應(yīng)的方法。


  7、修改對(duì)象A的equals方法的簽名,那么使用HashMap存放這個(gè)對(duì)象實(shí)例的時(shí)候,會(huì)調(diào)用哪個(gè)equals方法?


  會(huì)調(diào)用對(duì)象的equals方法,如果對(duì)象的equals方法沒(méi)有被重寫(xiě),equals方法和==都是比較棧內(nèi)局部變量表中指向堆內(nèi)存地址值是否相等。


  8、Java中實(shí)現(xiàn)多態(tài)的機(jī)制是什么?


  多態(tài)是指程序中定義的引用變量所指向的具體類(lèi)型和通過(guò)該引用變量發(fā)出的方法調(diào)用在編譯時(shí)不確定,在運(yùn)行期間才確定,一個(gè)引用變量到底會(huì)指向哪個(gè)類(lèi)的實(shí)例。這樣就可以不用修改源程序,就可以讓引用變量綁定到各種不同的類(lèi)實(shí)現(xiàn)上。


  Java實(shí)現(xiàn)多態(tài)有三個(gè)必要條件:繼承、重定、向上轉(zhuǎn)型,在多態(tài)中需要將子類(lèi)的引用賦值給父類(lèi)對(duì)象,只有這樣該引用才能夠具備調(diào)用父類(lèi)方法和子類(lèi)的方法。


  9、說(shuō)說(shuō)你對(duì)Java反射的理解


  在運(yùn)行狀態(tài)中,對(duì)任意一個(gè)類(lèi),都能知道這個(gè)類(lèi)的所有屬性和方法,對(duì)任意一個(gè)對(duì)象,都能調(diào)用它的任意一個(gè)方法和屬性。這種能動(dòng)態(tài)獲取信息及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為java語(yǔ)言的反射機(jī)制。


  反射的作用:


  開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)遇到某個(gè)類(lèi)的某個(gè)成員變量、方法或?qū)傩允撬接械模蛑粚?duì)系統(tǒng)應(yīng)用開(kāi)放,這里就可以利用java的反射機(jī)制通過(guò)反射來(lái)獲取所需的私有成員或是方法。


  獲取類(lèi)的Class對(duì)象實(shí)例Classclz=Class.forName("com.zhenai.api.Apple");


  根據(jù)Class對(duì)象實(shí)例獲取Constructor對(duì)象ConstructorappConstructor=clz.getConstructor();


  使用Constructor對(duì)象的newInstance方法獲取反射類(lèi)對(duì)象ObjectappleObj=appConstructor.newInstance();


  獲取方法的Method對(duì)象MethodsetPriceMethod=clz.getMethod("setPrice",int.class);


  利用invoke方法調(diào)用方法setPriceMethod.invoke(appleObj,14);


  通過(guò)getFields()可以獲取Class類(lèi)的屬性,但無(wú)法獲取私有屬性,而getDeclaredFields()可以獲取到包括私有屬性在內(nèi)的所有屬性。帶有Declared修飾的方法可以反射到私有的方法,沒(méi)有Declared修飾的只能用來(lái)反射公有的方法,其他如AnnotationFieldConstructor也是如此。


  10、說(shuō)一下泛型原理,并舉例說(shuō)明


  泛型就是將類(lèi)型變成參數(shù)傳入,使得可以使用的類(lèi)型多樣化,從而實(shí)現(xiàn)解耦。Java泛型是在Java1.5以后出現(xiàn)的,為保持對(duì)以前版本的兼容,使用了擦除的方法實(shí)現(xiàn)泛型。擦除是指在一定程度無(wú)視類(lèi)型參數(shù)T,直接從T所在的類(lèi)開(kāi)始向上T的父類(lèi)去擦除,如調(diào)用泛型方法,傳入類(lèi)型參數(shù)T進(jìn)入方法內(nèi)部,若沒(méi)在聲明時(shí)做類(lèi)似publicTmethodName(TextendsFathert){},Java就進(jìn)行了向上類(lèi)型的擦除,直接把參數(shù)t當(dāng)做Object類(lèi)來(lái)處理,而不是傳進(jìn)去的T。即在有泛型的任何類(lèi)和方法內(nèi)部,它都無(wú)法知道自己的泛型參數(shù),擦除和轉(zhuǎn)型都是在邊界上發(fā)生,即傳進(jìn)去的參在進(jìn)入類(lèi)或方法時(shí)被擦除掉,但傳出來(lái)的時(shí)候又被轉(zhuǎn)成了我們?cè)O(shè)置的T。在泛型類(lèi)或方法內(nèi),任何涉及到具體類(lèi)型(即擦除后的類(lèi)型的子類(lèi))操作都不能進(jìn)行,如newT(),或者T.play()(play為某子類(lèi)的方法而不是擦除后的類(lèi)的方法)


以上就是長(zhǎng)沙達(dá)內(nèi)教育java培訓(xùn)機(jī)構(gòu)小編介紹的“Java深入源碼級(jí)面試題”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專(zhuān)業(yè)老師隨時(shí)為你服務(wù)。


相關(guān)推薦


最新最全java面試題及答案(初級(jí)到高級(jí))


2019史上最全java面試題題庫(kù)大全800題


2019年最為常見(jiàn)的java就業(yè)筆試題大全


2019年Java開(kāi)發(fā)工程師上機(jī)筆試題


Java筆試題與答案(全解析)


培訓(xùn)啦提醒您:交易時(shí)請(qǐng)核實(shí)對(duì)方資質(zhì),對(duì)于過(guò)大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。