真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

今天帶你們分析一下java深入源碼級的面試題

今天雙11剁手節(jié),祝大家節(jié)日快樂

成都創(chuàng)新互聯(lián)于2013年成立,先為三門等服務(wù)建站,三門等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為三門企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

今天和大家一起分析一下那些面試中可能會問到的java深入源碼級的面試題

對此很多面試中遇到的問題,花了15個小時整理成為了一份983頁的PDF文檔。
今天帶你們分析一下java深入源碼級的面試題
今天帶你們分析一下java深入源碼級的面試題

(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)
可以點擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:×××)

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

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

1.1 哪些對象可以被看做是GC Roots呢?

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

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

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

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

即使不可達(dá),對象也不一定會被垃圾收集器回收,
1)先判斷對象是否有必要執(zhí)行finalize()方法,對象必須重寫finalize()方法且沒有被運行過。

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

2、講一下常見編碼方式?

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

1)ASCII碼:總共128個,用一個字節(jié)的低7位表示,0?31控制字符如換回車刪除等;32~126是打印字符,可通過鍵盤輸入并顯示出來;

2)ISO-8859-1,用來擴(kuò)展ASCII編碼,256個字符,涵蓋了大多數(shù)西歐語言字符。

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

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

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

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

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

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

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

代理是一種常用的設(shè)計模式,目的是:為其他對象提供一個代理以控制對某個對象的訪問,將兩個類的關(guān)系解耦。代理類和委托類都要實現(xiàn)相同的接口,因為代理真正調(diào)用的是委托類的方法。

區(qū)別:

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

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

實現(xiàn)步驟:a.實現(xiàn)InvocationHandler接口創(chuàng)建自己的調(diào)用處理器;b.給Proxy類提供ClassLoader和代理接口類型數(shù)組創(chuàng)建動態(tài)代理類;c.利用反射機(jī)制得到動態(tài)代理類的構(gòu)造函數(shù);d.利用動態(tài)代理類的構(gòu)造函數(shù)創(chuàng)建動態(tài)代理類對象;

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

5、Java的異常體系

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

1)Error是程序無法處理的錯誤,由JVM產(chǎn)生和拋出,如OOM、ThreadDeath等。這些異常發(fā)生時,JVM一般會選擇終止程序。

2)Exception是程序本身可以處理的異常,又分為運行時異常(RuntimeException)(也叫Checked Eception)和非運行時異常(不檢查異常Unchecked Exception)。運行時異常有NullPointerException\IndexOutOfBoundsException等,這些異常一般是由程序邏輯錯誤引起的,應(yīng)盡可能避免。非運行時異常有IOException`SQLException\FileNotFoundException`以及由用戶自定義的Exception異常等。

6、談?wù)勀銓馕雠c分派的認(rèn)識。

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

分派可分為靜態(tài)分派和動態(tài)分派,重載屬于靜態(tài)分派,覆蓋屬于動態(tài)分派。靜態(tài)分派是指在重載時通過參數(shù)的靜態(tài)類型而非實際類型作為判斷依據(jù),在編譯階段,編譯器可根據(jù)參數(shù)的靜態(tài)類型決定使用哪一個重載版本。動態(tài)分派則需要根據(jù)實際類型來調(diào)用相應(yīng)的方法。 ? ? ?

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

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

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

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

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

9、如何將一個Java對象序列化到文件里?

ObjectOutputStream.writeObject()負(fù)責(zé)將指定的流寫入,ObjectInputStream.readObject()從指定流讀取序列化數(shù)據(jù)。? ? ?

?//寫入
try {
    ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("D:/student.txt"));
    os.writeObject(studentList);
    os.close();
} catch(FileNotFoundException e) {
    e.printStackTrace();
} catch(IOException e) {
    e.printStackTrace();
}

10、說說你對Java反射的理解

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

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

1)獲取類的Class對象實例 Class clz = Class.forName("com.zhenai.api.Apple");

2)根據(jù)Class對象實例獲取Constructor對象? Constructor appConstructor = clz.getConstructor();

3)使用Constructor對象的newInstance方法獲取反射類對象 Object appleObj = appConstructor.newInstance();

4)獲取方法的Method對象? Method setPriceMethod = clz.getMethod("setPrice", int.class);

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

6)通過getFields()可以獲取Class類的屬性,但無法獲取私有屬性,而getDeclaredFields()可以獲取到包括私有屬性在內(nèi)的所有屬性。帶有Declared修飾的方法可以反射到私有的方法,沒有Declared修飾的只能用來反射公有的方法,其他如Annotation`Field\Constructor`也是如此。

11、說說你對Java注解的理解

注解是通過@interface關(guān)鍵字來進(jìn)行定義的,形式和接口差不多,只是前面多了一個@

public @interface TestAnnotation {
}

使用時@TestAnnotation來引用,要使注解能正常工作,還需要使用元注解,它是可以注解到注解上的注解。元標(biāo)簽有@Retention?@Documented @Target @Inherited @Repeatable五種

@Retention說明注解的存活時間,取值有RetentionPolicy.SOURCE注解只在源碼階段保留,在編譯器進(jìn)行編譯時被丟棄;RetentionPolicy.CLASS 注解只保留到編譯進(jìn)行的時候,并不會被加載到JVM中。RetentionPolicy.RUNTIME可以留到程序運行的時候,它會被加載進(jìn)入到JVM中,所以在程序運行時可以獲取到它們。

@Documented 注解中的元素包含到javadoc中去

@Target? 限定注解的應(yīng)用場景,ElementType.FIELD給屬性進(jìn)行注解;ElementType.LOCAL_VARIABLE可以給局部變量進(jìn)行注解;ElementType.METHOD可以給方法進(jìn)行注解;ElementType.PACKAGE可以給一個包進(jìn)行注解 ElementType.TYPE可以給一個類型進(jìn)行注解,如類、接口、枚舉

@Inherited 若一個超類被@Inherited注解過的注解進(jìn)行注解,它的子類沒有被任何注解應(yīng)用的話,該子類就可繼承超類的注解;

注解的作用:

1)提供信息給編譯器:編譯器可利用注解來探測錯誤和警告信息

2)編譯階段:軟件工具可以利用注解信息來生成代碼、html文檔或做其它相應(yīng)處理;

3)運行階段:程序運行時可利用注解提取代碼

注解是通過反射獲取的,可以通過Class對象的isAnnotationPresent()方法判斷它是否應(yīng)用了某個注解,再通過getAnnotation()方法獲取Annotation對象

12、說一下泛型原理,并舉例說明

泛型就是將類型變成參數(shù)傳入,使得可以使用的類型多樣化,從而實現(xiàn)解耦。Java泛型是在Java1.5以后出現(xiàn)的,為保持對以前版本的兼容,使用了擦除的方法實現(xiàn)泛型。擦除是指在一定程度無視類型參數(shù)T,直接從T所在的類開始向上T的父類去擦除,如調(diào)用泛型方法,傳入類型參數(shù)T進(jìn)入方法內(nèi)部,若沒在聲明時做類似public T methodName(T extends Father t){},Java就進(jìn)行了向上類型的擦除,直接把參數(shù)t當(dāng)做Object類來處理,而不是傳進(jìn)去的T。

即在有泛型的任何類和方法內(nèi)部,它都無法知道自己的泛型參數(shù),擦除和轉(zhuǎn)型都是在邊界上發(fā)生,即傳進(jìn)去的參在進(jìn)入類或方法時被擦除掉,但傳出來的時候又被轉(zhuǎn)成了我們設(shè)置的T。在泛型類或方法內(nèi),任何涉及到具體類型(即擦除后的類型的子類)操作都不能進(jìn)行,如new T(),或者T.play()(play為某子類的方法而不是擦除后的類的方法)

13、Java中String的了解

1)String類是final型,固String類不能被繼承,它的成員方法也都默認(rèn)為final方法。String對象一旦創(chuàng)建就固定不變了,對String對象的任何改變都不影響到原對象,相關(guān)的任何改變操作都會生成新的String對象。

2)String類是通過char數(shù)組來保存字符串的,String對equals方法進(jìn)行了重定,比較的是值相等。

String a = "test"; String b = "test"; String c = new String("test");

a、b和字面上的test都是指向JVM字符串常量池中的"test"對象,他們指向同一個對象。而new關(guān)鍵字一定會產(chǎn)生一個對象test,該對象存儲在堆中。所以new String("test")產(chǎn)生了兩個對象,保存在棧中的c和保存在堆中的test。而在java中根本就不存在兩個完全一模一樣的字符串對象,故在堆中的test應(yīng)該是引用字符串常量池中的test。

例:

String str1 = "abc"; //棧中開辟一塊空間存放引用str1,str1指向池中String常量"abc"
String str2 = "def"; //棧中開辟一塊空間存放引用str2,str2指向池中String常量"def"
String str3 = str1 + str2;//棧中開辟一塊空間存放引用str3
//str1+str2通過StringBuilder的最后一步toString()方法返回一個新的String對象"abcdef"
//會在堆中開辟一塊空間存放此對象,引用str3指向堆中的(str1+str2)所返回的新String對象。
System.out.println(str3 == "abcdef");//返回false
因為str3指向堆中的"abcdef"對象,而"abcdef"是字符池中的對象,所以結(jié)果為false。JVM對String str="abc"對象放在常量池是在編譯時做的,而String str3=str1+str2是在運行時才知道的,new對象也是在運行時才做的。

14、String為什么要設(shè)計成不可變的?

1)字符串常量池需要String不可變。
因為String設(shè)計成不可變,當(dāng)創(chuàng)建一個String對象時,若此字符串值已經(jīng)存在于常量池中,則不會創(chuàng)建一個新的對象,而是引用已經(jīng)存在的對象。如果字符串變量允許必變,會導(dǎo)致各種邏輯錯誤,如改變一個對象會影響到另一個獨立對象。

2)String對象可以緩存hashCode。
字符串的不可變性保證了hash碼的唯一性,因此可以緩存String的hashCode,這樣不用每次去重新計算哈希碼。在進(jìn)行字符串比較時,可以直接比較hashCode,提高了比較性能;

3)安全性。
String被許多java類用來當(dāng)作參數(shù),如url地址,文件path路徑,反射機(jī)制所需的Strign參數(shù)等,若String可變,將會引起各種安全隱患。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)
可以點擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:×××)

今天帶你們分析一下java深入源碼級的面試題


網(wǎng)站題目:今天帶你們分析一下java深入源碼級的面試題
網(wǎng)站URL:http://weahome.cn/article/jssgji.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部