面試心得與總結-——答案整理_4 持續更新

小鞅發表於2016-08-22
[b][size=medium][color=red]31. 反射的作用與原理。[/color][/size][/b]
[size=medium]1:反射的作用:反射可以增加程式碼的靈活性,通過反射可以使系統和外掛解耦,如Spring就是使用反射來實現控制反轉的(IOC)。
2:什麼是反射: java執行時階段的程度對自身的一種審查的能力;
3:反射機制的原理:反射就是java語言在執行時可以通過獲取類的class物件,並通過class物件獲取到當前物件的方法(包括私有方法),屬性,以及構造方法,執行時class物件相當於外部程式訪問記憶體中該類的一道門,通過該到門能獲取到執行時該類的各種東西。[/size]

[color=red][b][size=medium]32. 泛型常用特點,List<String>能否轉為List<Object>。[/size][/b][/color]
[size=medium]1:泛型的種類:泛型類、泛型介面、泛型方法。Java泛型被引入的好處是安全簡單。增加程式碼的複用性。(泛型解決了方法的過載問題:public void write(Integer i, Integer[] ia);public void write(Double d, Double[] da); 的範型版本為public <T> void write(T t, T[] ta))
2:為什麼要引用泛型:在java1.5之前,如果一個方法的引數中要支援任意型別,則一般用Object類來作為引數的型別,因此在執行的時候就要進行型別轉換。這種自動轉換型別容易出現當編譯的時候不會報錯,而執行的時候回報錯,這是一個安全隱患(我還沒有遇到過,可能是這種情況,就是返回物件是Object,此時要將 Object轉換成具體的型別時這是容易出現錯誤的)。注意:在java中父類是可以轉換成子類的而且不報錯,呼叫的時候出錯執行時才能檢查到(親測Sunzi sun=(Sunzi)new Child();可以,編譯通過)
3:泛型的好處是在編譯的時候檢查型別安全(型別檢查是保證型別轉換是可以正確轉換的(object編譯的時候就沒有檢查到父類轉子類)),並且所有的強制轉換都是自動和隱式的,提高程式碼的重用率。
4:泛型資訊在編譯的時候會被自動擦除的,也就是在位元組碼中沒有泛型的資訊,並使用其限定型別替換(無限定型別用Object),如public T fun(T t)替換成public Object fun(Object t),限定型別只的是T extend Father,則用Father替換T,List<T> 則變成List。
5:泛型主要的體現還是在型別安全的檢查與限定,如List<String>,那我們就只能放入String型別的,在這兒就體現了型別檢查了。
6:List<String>不能List<Object>,因為泛型並不具有繼承性。只是一個限定的作用。[/size]
[b][color=red][size=medium]
33. 解析XML的幾種方式的原理與特點:DOM、SAX、PULL。[/size][/color][/b]
[size=medium]1:DOM是基於樹的解析,DOM是把XML全部載入到記憶體中建立一棵樹之後再進行處理。所以DOM不適合處理大型的XML【會產生記憶體的急劇膨脹】。這樣可以隨時修改xml檔案內容。
2:SAX基於事件的解析,sax解析一行一行的讀取xml檔案開始標記的時候執行startElement方法,然後執行對應解析方法character方法,當遇到結束表示符就呼叫endElement方法,所以所是基於事件型解析, SAX不必把全部的xml都載入到記憶體中。但是SAX的缺點也很明顯,它只能對檔案順序解析一遍,不支援對檔案的隨意存取。SAX也僅僅能夠讀取檔案的內容,並不能修改內容。DOM可以隨意修改檔案樹。(主要用於讀取xml檔案)
3:SAX 和 DOM 不是相互排斥的,記住這點很重要。您可以使用 DOM 來建立 SAX 事件流,也可以使用 SAX 來建立 DOM 樹。事實上,用於建立 DOM 樹的大多數解析器實際上都使用 SAX 來完成這個任務![/size]

[b][color=red][size=medium]34. Java與C++對比。[/size][/color][/b]
[size=medium](1)Java比C++程式可靠性更高。
(2)Java語言中沒有指標的概念,
(3)Java用介面(Interface)技術取代C++程式中的多繼承性;
(4)Java語言不需要程式對記憶體進行分配和回收。Java中自動回收記憶體,而c++中要呼叫new和delete來申請和釋放記憶體,如果對記憶體分配與申請掌握不好就容易報錯
(5)異常:JAVA中的異常機制用於捕獲例外事件,增強系統容錯能力 try{//可能產生例外的程式碼 }catch(exceptionType name){ //處理 } 其中exceptionType表示異常型別。而C++則沒有如此方便的機制
(6)“可怕”的goto語句是c和c++的“遺物”,它是該語言技術上的合法部分,引用goto語句引起了程式結構的混亂,不易理解,goto語句子要用於無條件轉移子程式和多結構分支技術。鑑於以廣理由,Java不提供goto語句,它雖然指定goto作為關鍵字,但不支援它的使用,使程式簡潔易讀。[/size]
[b][color=red]
[size=medium]35. Java1.7與1.8新特性。[/size][/color][/b]
[size=medium]1:1.7新特性:
1:switch中可以使用字串了運用
2:List<String> tempList = new ArrayList<>(); 即泛型例項化型別自動推斷
3.語法上支援集合,而不一定是陣列final List<Integer> piDigits = [ 1,2,3,4,5,8 ];
4:try塊可以不用finally手動關閉,直接try塊中就可以關閉
5:很長的數字可讀性不好,在Java 7中可以使用下劃線分隔長int以及long了,如1_1 * 10 = 110,120 – 1_0 = 110
Java1.8新特性
1: Java 8允許我們給介面新增一個非抽象的方法實現,只需要使用 default關鍵字即可,default double sqrt(int a) {return Math.sqrt(a);},改方法不用實現,可以自己直接通過子類呼叫。
2:增加了lamda表示式
3:Java 8 在包java.time下包含了一組全新的時間日期API[/size]

[size=medium][color=red][b]36. 設計模式:單例、工廠、介面卡、責任鏈、觀察者等等。[/b][/color][/size]

[b][size=medium][color=red]37. JNI的使用。[/color][/size][/b]
[size=medium]1:jni就是通過java本地方法可以呼叫其他語言的程式碼,能與其它語言(如C、C++)的動態庫進行互動
2:jni的使用場景
1:java是一門半解釋性的語言,程式碼很容易被別人反編譯,因此可以採用jni通過c語言或者c++來實現其核心,這樣還能提高一定的效能;
2:一些效能要求特別高時,可以採用組合語言實現,通過jni呼叫;
3:別的語言已經實現了的功能,通過jni可以直接呼叫,而不用重新編寫。
3:jni使用步驟:用native關鍵字定義本地方法,然後編譯該類為class檔案,用javah工具生成.h的標頭檔案,然後用c/c++語言實現其中的.h標頭檔案中的方法,並生成動態庫(以.so結尾的檔案,大多數動態庫是以.dll檔案結尾的)),然後提供給java使用[/size]

[b][size=medium][color=red]38:java的動態代理與靜態代理[/color][/size][/b]
[size=medium]1:靜態代理,這比較簡單,相當於一個靜態代理模式,比如要在一方法前輸入一個輸出helloworld方法的前面輸出一句welcome,則可以用一個代理類,在輸出welcome的時候回撥輸出helloworld的方法。缺點是當一個藉口中有很多個方法需前輸出welcome,則代理類中就要取實現藉口中的每一個方法,然後回撥,這樣比較麻煩;http://kuangbaoxu.iteye.com/blog/192804
2:動態代理就是將給一個需要代理的物件關聯一個呼叫處理器(InvokeHandler),然後通過Prox.newPoxyInstance物件建立代理物件,通過該代理物件將要代理的真實物件和InvokeHandler的物件關聯起來,並將代理物件強制轉換成真實物件所對應的類,然後通過該代理物件的的引用去呼叫方法,則會出現動態代理的情況;真實的原理就是在當通過代理物件的引用都呼叫的時候,會呼叫invokehander物件的invoke方法(個人理解:因為通過Proxy類建立代理物件的時候,會傳遞一個真實代理物件實現的類的介面進去,動態代理通過內部實現了該介面的所有方法,然後在每個方法中回撥InvokeHander類物件的invoke方法,並不是在編譯的時候採用inline的那種方法直接編譯進去,因為要用到反射,所以不可能是採用內聯的方法實現的)。http://www.cnblogs.com/xiaoluo501395377/p/3383130.html[/size]

[size=medium]Java裡有很多很雜的東西,有時候需要你閱讀原始碼,大多數可能書裡面講的不是太清楚,需要你在網上尋找答案。

推薦書籍:《java核心技術卷I》《Thinking in java》《java併發程式設計》《effictive java》《大話設計模式》[/size]

相關文章