更新時間:2019-11-15 14:55:02 來源:動力節點 瀏覽2431次
1、哪些情況下的對象會被垃圾回收機制處理掉?
利用可達性分析算法,虛擬機會將一些對象定義為GCRoots,從GCRoots出發沿著引用鏈向下尋找,如果某個對象不能通過GCRoots尋找到,虛擬機就認為該對象可以被回收掉。
1.1哪些對象可以被看做是GCRoots呢?
1)虛擬機棧(棧幀中的本地變量表)中引用的對象;
2)方法區中的類靜態屬性引用的對象,常量引用的對象;
3)本地方法棧中JNI(Native方法)引用的對象;
1.2對象不可達,一定會被垃圾收集器回收么?
即使不可達,對象也不一定會被垃圾收集器回收
1)先判斷對象是否有必要執行finalize()方法,對象必須重寫finalize()方法且沒有被運行過。
2)若有必要執行,會把對象放到一個隊列中,JVM會開一個線程去回收它們,這是對象最后一次可以逃逸清理的機會。
2、講一下常見編碼方式?
編碼的意義:計算機中存儲的最小單元是一個字節即8bit,所能表示的字符范圍是255個,而人類要表示的符號太多,無法用一個字節來完全表示,固需要將符號編碼,將各種語言翻譯成計算機能懂的語言。
1)ASCII碼:
總共128個,用一個字節的低7位表示,0?31控制字符如換回車刪除等;32~126是打印字符,可通過鍵盤輸入并顯示出來;
2)ISO-8859-1
用來擴展ASCII編碼,256個字符,涵蓋了大多數西歐語言字符。
3)GB2312
雙字節編碼,總編碼范圍是A1-A7,A1-A9是符號區,包含682個字符,B0-B7是漢字區,包含6763個漢字;
4)GBK
為了擴展GB2312,加入了更多的漢字,編碼范圍是8140~FEFE,有23940個碼位,能表示21003個漢字。
5)UTF-16
ISO試圖想創建一個全新的超語言字典,世界上所有語言都可通過這本字典Unicode來相互翻譯,而UTF-16定義了Unicode字符在計算機中存取方法,用兩個字節來表示Unicode轉化格式。不論什么字符都可用兩字節表示,即16bit,固叫UTF-16。
6)UTF-8:
UTF-16統一采用兩字節表示一個字符,但有些字符只用一個字節就可表示,浪費存儲空間,而UTF-8采用一種變長技術,每個編碼區域有不同的字碼長度。不同類型的字符可以由1~6個字節組成。
3、utf-8編碼中的中文占幾個字節;int型幾個字節?
utf-8是一種變長編碼技術,utf-8編碼中的中文占用的字節不確定,可能2個、3個、4個,int型占4個字節。
4、靜態代理和動態代理的區別,什么場景使用?
代理是一種常用的設計模式,
目的是:
為其他對象提供一個代理以控制對某個對象的訪問,將兩個類的關系解耦。代理類和委托類都要實現相同的接口,因為代理真正調用的是委托類的方法。
區別:
1)靜態代理:
由程序員創建或是由特定工具生成,在代碼編譯時就確定了被代理的類是哪一個是靜態代理。靜態代理通常只代理一個類;
2)動態代理:
在代碼運行期間,運用反射機制動態創建生成。動態代理代理的是一個接口下的多個實現類;
實現步驟:
a.實現InvocationHandler接口創建自己的調用處理器;
b.給Proxy類提供ClassLoader和代理接口類型數組創建動態代理類;
c.利用反射機制得到動態代理類的構造函數;
d.利用動態代理類的構造函數創建動態代理類對象;
使用場景:
Retrofit中直接調用接口的方法;Spring的AOP機制;
5、Java的異常體系
Java中Throwable是所有異常和錯誤的超類,兩個直接子類是Error(錯誤)和Exception(異常):
1)Error是程序無法處理的錯誤,由JVM產生和拋出
如OOM、ThreadDeath等。這些異常發生時,JVM一般會選擇終止程序。
2)Exception是程序本身可以處理的異常
又分為運行時異常(RuntimeException)(也叫CheckedEception)和非運行時異常(不檢查異常UncheckedException)。
運行時異常
有NullPointerException\IndexOutOfBoundsException等,這些異常一般是由程序邏輯錯誤引起的,應盡可能避免。
非運行時異常
有IOException\SQLException\FileNotFoundException以及由用戶自定義的Exception異常等。
6、談談你對解析與分派的認識。
解析
指方法在運行前,即編譯期間就可知的,有一個確定的版本,運行期間也不會改變。解析是靜態的,在類加載的解析階段就可將符號引用轉變成直接引用。
分派
可分為靜態分派和動態分派,重載屬于靜態分派,覆蓋屬于動態分派。
靜態分派是指在重載時通過參數的靜態類型而非實際類型作為判斷依據,在編譯階段,編譯器可根據參數的靜態類型決定使用哪一個重載版本。
動態分派則需要根據實際類型來調用相應的方法。
7、修改對象A的equals方法的簽名,那么使用HashMap存放這個對象實例的時候,會調用哪個equals方法?
會調用對象的equals方法,如果對象的equals方法沒有被重寫,equals方法和==都是比較棧內局部變量表中指向堆內存地址值是否相等。
8、Java中實現多態的機制是什么?
多態是指程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編譯時不確定,在運行期間才確定,一個引用變量到底會指向哪個類的實例。這樣就可以不用修改源程序,就可以讓引用變量綁定到各種不同的類實現上。
Java實現多態有三個必要條件:繼承、重定、向上轉型,在多態中需要將子類的引用賦值給父類對象,只有這樣該引用才能夠具備調用父類方法和子類的方法。
9、說說你對Java反射的理解
在運行狀態中,對任意一個類,都能知道這個類的所有屬性和方法,對任意一個對象,都能調用它的任意一個方法和屬性。這種能動態獲取信息及動態調用對象方法的功能稱為java語言的反射機制。
反射的作用:
開發過程中,經常會遇到某個類的某個成員變量、方法或屬性是私有的,或只對系統應用開放,這里就可以利用java的反射機制通過反射來獲取所需的私有成員或是方法。
獲取類的Class對象實例Classclz=Class.forName("com.zhenai.api.Apple");
根據Class對象實例獲取Constructor對象ConstructorappConstructor=clz.getConstructor();
使用Constructor對象的newInstance方法獲取反射類對象ObjectappleObj=appConstructor.newInstance();
獲取方法的Method對象MethodsetPriceMethod=clz.getMethod("setPrice",int.class);
利用invoke方法調用方法setPriceMethod.invoke(appleObj,14);
通過getFields()可以獲取Class類的屬性,但無法獲取私有屬性,而getDeclaredFields()可以獲取到包括私有屬性在內的所有屬性。帶有Declared修飾的方法可以反射到私有的方法,沒有Declared修飾的只能用來反射公有的方法,其他如Annotation\Field\Constructor也是如此。
10、說一下泛型原理,并舉例說明
泛型就是將類型變成參數傳入,使得可以使用的類型多樣化,從而實現解耦。Java泛型是在Java1.5以后出現的,為保持對以前版本的兼容,使用了擦除的方法實現泛型。擦除是指在一定程度無視類型參數T,直接從T所在的類開始向上T的父類去擦除,如調用泛型方法,傳入類型參數T進入方法內部,若沒在聲明時做類似publicTmethodName(TextendsFathert){},Java就進行了向上類型的擦除,直接把參數t當做Object類來處理,而不是傳進去的T。即在有泛型的任何類和方法內部,它都無法知道自己的泛型參數,擦除和轉型都是在邊界上發生,即傳進去的參在進入類或方法時被擦除掉,但傳出來的時候又被轉成了我們設置的T。在泛型類或方法內,任何涉及到具體類型(即擦除后的類型的子類)操作都不能進行,如newT(),或者T.play()(play為某子類的方法而不是擦除后的類的方法)
以上就是動力節點java培訓機構小編介紹的“Java深入源碼級面試題”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
相關推薦
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習