1. 程式人生 > >Java面試臨時複習題總結(一)

Java面試臨時複習題總結(一)

總結(一)都是網上查詢總結的,如果有侵權,請私信告知我,我會盡快刪除。

第一,談談final, finally, finalize的區別。 最常被問到。

答:

final是一種修飾符。可以用來修飾類,方法,變數。被final修飾的類不能派生子類,不能被繼承(一個類不能同時被abstract和final修飾);被final修飾的方法,不能被過載;被final修飾的變數相當於常量,必須給定初值,以後也只能讀取,不能更改。

拓展:基於class被final修飾後就不能派生子類被繼承,所以它不能被abstract同時修飾,因為abstract修飾的class本身就是需要通過子類來實現,需要被繼承的,所以不能同時修飾。

finally是java中一種保證重點程式碼一定要被執行的一種機制。我們可以使用try..finally或者try..catch..finally來進行類似關閉JDBC連線,保證unlock鎖等動作。

finalize則是java.long.Object的一個方法。它的設計目的是保證物件在被垃圾收集前完成特定資源的回收。但是這種機制現在已經不推薦使用,並且在JDK9中被標記為deprecated(不贊成)

拓展:finalize被設計成物件被垃圾收集前呼叫,這就意味著finalize方法的物件是個“特殊公民”,JVM要對它進行額外處理。finalize本質上成為了快速回收的阻礙者,可能導致你的物件經過幾個垃圾收集週期才能被回收。

OOM(out of Memory記憶體不足)

Java平臺在逐步使用java.long.ref.Cleaner替換掉原來的finalize

第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(介面)?

答:匿名內部實現時必須藉助一個類或者一個介面,從這個層次上講它是可以繼承其他類也可以實現介面的,但是若是通過extend是或implements關鍵字是不可能的。

拓展:非靜態內部類,匿名內部類,會持有外部類物件;靜態內部類不能訪問外部的非靜態成員。

第三,Static Nested Class 和 Inner Class的不同,說得越多越好(面試題有的很籠統)。

第四,&和&&的區別。 這個問得很少。

第五,HashMap和Hashtable的區別。 常問。(兩者都實現了Map介面)

HashMap

執行緒不安全

效率較高

允許有null的鍵和值

方法不是synchronize,需要提供外同步

有containsvalue和containskey方法

HashMap是java1.2引進的Map interface的實現

HashMap是HashTable的輕量級實現

HashTable

執行緒安全

效率較低

不允許有null的鍵和值

方法是synchronize

有contains方法

HashTable繼承於Dictionary類

HashTable比HashMap要舊

第六,Collection 和 Collections的區別。 你千萬別說一個是單數一個是複數。

答:

Collections是java.util下的一個類,它包含有各種有關集合操作的靜態方法

Collection是java.util下的一個介面,是各種集合結構的父介面

第七,什麼時候用assert。 API級的技術人員有可能會問這個。

答:assert(斷言)是java2在1.4中新增的關鍵字。

在軟體開發中,斷言是一種常用的除錯方式,很多開發語言都支援這種機制。

一般來說,斷言用於保證程式最基本、關鍵的正確性。斷言檢查通常在開發和測試時開啟。為了保證程式執行效率,在軟體釋出後斷言檢查通常是關閉的。

斷言是一個包含布林表示式的語句,在執行這個語句時,假定這個表示式是true;

如果表示式的值是false,系統會報告AssertionError.

斷言有兩種形式:

assert Expression1;

assert Expression1:Expression2;

其中Expression1表示一個布林表示式,Expression2表示一個基本型別、表示式或者是一個Object,用於在失敗時輸出錯誤資訊。

第八,GC是什麼? 為什麼要有GC? 基礎。

答:GC是垃圾收集的意思(Gabage Collection),記憶體處理是程式設計人員容易出現問題的地方,忘記或者錯誤的記憶體回收會導致程式或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測物件是否超過作用域從而達到自動回收記憶體的目的,Java語言沒有提供釋放已分配記憶體的顯示操作方法。

第九,String s = new String("xyz");建立了幾個String Object?

答:(首先這個問題我看了很多人的講解,基本都是說建立了2個物件,但是我還是比較認同1個或2個,理由如下:)

這個題要分兩種情況,首先要了解,new一個String物件,要先在字串常量池建立一個xyz,然後在堆記憶體中建立一個xyz,最後把堆記憶體地址返回給s引用。

第一種情況:事先字串常量池中沒有建立過xyz,那麼就先在常量池中建立了一個物件,然後在堆記憶體中建立一個xyz,這種是建立了2個物件

第二種情況:在字串常量池中已經存在了xyz,此時不需要再建立,只需要在堆記憶體中建立一個xyz.這種就是建立了1個物件。

第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

答:Math.round(11.5)等於12

Math.round(-11.5)等於-11

拓展:Math類提供了三個有關取整的方法:ceil,floor,round,它們的左右與它們的英文含義相對應。

ceil英文意為“天花板”,表示向上取整

例如:Math.ceil(11.3)結果為12;Math.ceil(-11.3)結果為-11

floor英文意為“地板”,表示向下取整

例如:Math.floor(11.6)結果為11;Math.floor(-11.6)結果為-12

round表示“四捨五入”,演算法為Math.round(x+0.5),即原來的數字加上0.5再向下取整

第十一,short s1 = 1; s1 = s1 + 1;有什麼錯? short s1 = 1; s1 += 1;有什麼錯? 面試題都是很變態的,要做好受虐的準備。

答:首先要明確,java當中基本資料型別的轉換規則,

  1. 高位轉低位需要強制轉換
  2. 低位轉高位自動轉換。
  1. short s1 = 1; s1 = s1 + 1;s1是short型別,1是int型常量,s1+1的結果是int型別,把int型別的值賦給short型別,屬於高位轉低位,需要強制轉換,所以這裡會報錯。
  2. short s1 = 1; s1 += 1;這裡+=屬於複合賦值運算子,在java中隱含著自動轉換的功能,也就是說s1+=1;等效於s1=(short)(s1+1);所以不會報錯。

拓展:1.為什麼short s=1;是對的 答:short,byte,char整型直接賦值,如果整型在其承受範圍內就可以隱式轉換。

     2.float f=3.14;是正確的嗎? 答:不正確,編譯都無法通過。原因:精度不準確,在java中小數預設是double型別的,需要強制轉化才能是float,例如:float f=(float)3.14;或float f=3.14f;