1. 程式人生 > >java面試題集錦(一)

java面試題集錦(一)

 

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

final:可以修飾非抽象類和非抽象類成員方法和變數

    final類不能被繼承,沒有子類,final類中的方法預設是final

    被宣告為final的變數必須在申明時給定初始值,而在以後的應用中只能讀,不能修改

finally:在異常處理時提供finally塊來執行任何清除操作。如果丟擲一個異常,那麼相匹配的catch子句就會執行,然後控制就會進入finally塊(如果有的話)。

finalize:finalize是方法名,java技術允許使用finalize()方法在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作。這個方法是在垃圾收集器確認一個物件沒有被引用時對這個物件呼叫的。它是在Object類中定義的,因此,所有的類都繼承了它。子類覆蓋finalize()方法已整理系統資源或者執行其他清理工作。finalize()方法是在垃圾收集器刪除物件之前對這個物件呼叫的


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

 

  匿名內部類是沒有名字的內部類,匿名內部類必須繼承一個父類,或者實現一個介面,但最多隻能繼承一個父類,或實現一個介面。

  當我們只需要用某一個類一次時,且該類從意義上需要實現某個類或某個介面,這個特殊的擴充套件類就以匿名內部類來展現。

  由於匿名內部類沒有名字,所以它沒有建構函式。因為沒有建構函式,所以它必須完全借用父類的建構函式來例項化,匿名內部類完全把建立物件的任務交給了父類去完成。

  匿名內部類可以覆蓋父類可以體現多型性

  因為匿名內部類沒有名字,所以無法進行向下的強制型別轉換,持有對一個匿名內部類對引用的變數型別一定是它的直接或間接父類型別。

  注意匿名內部類的宣告是在編譯時進行的,例項化在執行時進行。


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

 

  static nested class 指靜態巢狀類,或稱巢狀類,是C++中常用的說法,inner class指內部類,是JAVA中的說法。

  static nested class相當於inner class中的靜態成員類。

(Static Nested Class是被宣告為靜態(static)的內部類,它可以不依賴於外部類例項被例項化。而通常的內部類需要在外部類例項化後才能例項化)

 

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

 

&和^,<<,<<<,|同屬於位運算子,其中&是按位與,例如,1&1=1,1&0=0,&&是邏輯運算子,處理真假值,例如,true&&true=true。

 

第五,HashMapHashtable的區別。 常問。

 

  hashmap是執行緒不安全的,        hashtable是執行緒安全的。

  hashmap的key和value都可以為NULL,    hashtable不可以。

  hashmap執行緒不同步,          hashtable執行緒同步。

  hashmap用enumerate遍歷,        hashtable用iterator遍歷。

  hashmap中hash預設陣列大小是16,而且一般是2的指數,

  hashtable中hash預設陣列大小是11,增加方式是old*2+1。

計算index的方法不同, hashtable直接用hashcode()得出,hashmap對hashcode重新計算得出。


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

 

collection是結合類的上級介面,子介面有List和Set等,Collections是java.util下的一個工具類,提供一些列靜態方法對集合搜尋排序執行緒同步化等。


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

 

assertion(斷言)在軟體開發中是一種常用的除錯方式,很多開發語言中都支援這種機制.在實現中,assertion就是在程式中的一條語句,它對一個boolean表示式進行檢查,一個正確程式必須保證這個boolean表示式的值為true;如果該值為false,說明程式已經處於不正確的狀態下,系統將給出警告或退出.一般來說,assertion用於保證程式最基本、關鍵的正確性.assertion檢查通常在開發和測試時開啟.為了提高效能,在軟體釋出後,assertion檢查通常是關閉的.

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

 

GC 即 garbage collection(垃圾收集),是JAVA用於回收記憶體的一種方式,主要的實現方法有引用計數,標記回收,複製清除等,GC可以避免記憶體洩露和堆疊溢位,有效提高記憶體的利用效率,同時將程式設計師從繁瑣的記憶體管理中釋放出來。

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

 

 兩個。第一個物件是字串常量"xyz" 第二個物件是new String("xyz")的時候產生的,在堆中分配記憶體給這個物件,只不過這個物件的內容是指向字串常量"xyz" 另外還有一個引用s,指向第二個物件。這是一個變數,在棧中分配記憶體。

 


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

            ceil的英文意義是天花板,該方法就表示向上取整,Math.ceil(11.3)的結果為12,Math.ceil(-11.6)的結果為-11;

           floor的英文是地板,該方法就表示向下取整,Math.floor(11.6)的結果是11,Math.floor(-11.4)的結果-12;

          round方法,他表示“四捨五入”,演算法為Math.floor(x+0.5),即將原來的數字加上0.5後再向下取整,所以,Math.round(11.5)的結果是12,Math.round(-11.5)的結果為-11.

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

 

借鑑:https://blog.csdn.net/u013781343/article/details/80527142

 

第十二,sleep() wait() 有什麼區別?搞執行緒的最愛。

 

sleep()是java.lang.Thread中的靜態方法,wait()是java.lang.Object中的方法;

wait和sleep區別: 分析這兩個方法:從執行權和鎖上來分析:
wait:可以指定時間也可以不指定時間。不指定時間,只能由對應的notify或者notifyAll來喚醒。
sleep:必須指定時間,時間到自動從凍結狀態轉成執行狀態(臨時阻塞狀態)。
wait:執行緒會釋放執行權,而且執行緒會釋放鎖。
Sleep:執行緒會釋放執行權,但不是不釋放鎖。

sleep()必須捕獲異常,而wait()不需要。

 

 

第十三,Java有沒有goto?


 很十三的問題,如果哪個面試的問到這個問題,我勸你還是別進這家公司。

 

goto是java的關鍵字,但java不支援goto,goto會影響程式的可讀性,使邏輯顯得混亂。

 

第十四,陣列有沒有length()這個方法? String有沒有length()這個方法?

 

  陣列中沒有length()這個方法,但有length這個屬性。用來表示陣列的長度。

      String中有length()這個方法。用來得到字串的長度。

 

第十五,OverloadOverride的區別。Overloaded的方法是否可以改變返回值的型別?
 常問。

Overload:過載

Override:重寫

過載:同一個類中,方法名相同,引數列表個數不同。與返回值型別無關。

重寫:存在於子父類,或者子父介面中,方法宣告相同。

Overload的方法可以改變返回值的型別,因為它與返回值型別無關。

 
第十六,Set裡的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別?

SetCollection容器的一個子介面,它不允許出現重複元素,當然也只允許有一個null物件

為什麼用equals呢?因為==是用來判斷兩者是否是同一物件(同一事物)或者說記憶體地址,而equals是用來判斷是否引用同一個物件或者說值是否相同。再看一下Set裡面存的是物件,還是物件的引用。根據java的儲存機制可知,set裡面存放的是物件的引用,所以當兩個元素只要滿足了equals()時就已經指向同一個物件,

也就出現了重複元素。所以應該用equals()來判斷。

 

第十七,給我一個你最常見到的runtime exception
 如果你這個答不出來,面試的人會認為你沒有實際程式設計經驗。

 

NullPointerException,空引用異常

ArithmeticException算數異常



第十八,errorexception有什麼區別?

 

error就是嚴重的錯誤,像JVM產生的一些錯誤等,會停止程式執行或產生錯誤結果程式設計師控制不了exception是一定程度上可預見的錯誤,可以捕獲以及處理。


第十九,List, Set, Map是否繼承自Collection介面?

 

Set 和List 都繼承了ConllectionSet具有與Collection完全一樣的介面,因此沒有任何額外的功能,不像有不同的List。實際上Set就是Collection,只 是行為不同。

 Map沒有繼承於Collection介面 Map集合中檢索元素時,只要給出鍵物件,就會返回對應的值物件 

 

第二十,abstract classinterface有什麼區別?
 常問。

 

1:抽象類只能被繼承,而且只能單繼承。

介面需要被實現,而且可以多實現。

2:抽象類中可以定義非抽象方法,子類可以直接繼承使用。

介面中都有抽象方法,需要子類必須去實現。

3:抽象類使用的是  is a 關係。

介面使用的 like a 關係。

4:抽象類的成員修飾符可以自定義。

介面中的成員修飾符是固定的。全都是public的。

  

第二十一,abstractmethod是否可同時是static,是否可同時是native,是否可同時是synchronized?

 

abstact方法需要子類重寫,重寫的概念是就例項方法而言, 所以不能是static。因為同一原因,要重寫就不能native,native,這個東西本身就和abstract衝突,他們都是方法的宣告,只是一個吧方法實現移交給子類,另一個是移交給本地作業系統。如果同時出現,就相當於即把實現移交給子類,又把實現移交給本地作業系統,那到底誰來實現具體方法呢!抽象方法在抽象類中,無例項,不能被呼叫,也沒有內容,所以synchronized沒有意義。當然抽象方法在被子類繼承以後,可以新增同步。

第二十二,介面是否可繼承介面? 抽象類是否可實現(implements)介面? 抽象類是否可繼承實體類(concrete class)?

 

 

介面可以繼承介面。

抽象類可以實現(implements)介面。

抽象類可繼承(extends)實體類,(但前提是實體類必須有明確的建構函式)

類與普通類的唯一區別就是不能建立例項物件和允許有abstract方法

 

第二十三,啟動一個執行緒是用run()還是start()?

主要是啟動start()簡單的說start()中包含run()



第二十四,構造器Constructor是否可被override?

構造器Constructor不能被繼承,因此不能重寫Override,但可以被過載Overload

 

第二十五,是否可以繼承String?

 String類為final,不可被繼承

 

Java關鍵字final有“這是無法改變的”或者“終態的”含義,它可以修飾非抽象類、非抽象類成員方法和變數

第二十六,當一個執行緒進入一個物件的一個synchronized方法後,其它執行緒是否可進入此物件的其它方法?


不能,一個物件的一個synchronized方法只能由一個執行緒訪問。 

物件的synchronized方法不能進入了,但它的其他非synchronized方法還是可以訪問的。


第二十七,try {}裡有一個return語句,那麼緊跟在這個try後的finally {}裡的code會不會被執行,什麼時候被執行,在return前還是後?
會執行,在return前執行。


第二十八,程式設計題: 用最有效率的方法算出2乘以8等於幾?
 C背景的程式設計師特別喜歡問這種問題。

 

2<<3; 表示2 向左移 3位

2的二進位制是0000 0010,左移3位後0001 0000

 

因為在計算機中邏輯運算子要比普通的+-*/計算的快

 

第二十九,兩個物件值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?


java語言的定義:
1) 物件相等則hashCode一定相等;
2) hashCode相等物件未必相等

(不一定,實踐發現,equals相等,hashcode也一定相等,但在一定情況下不一定相等,但是不相等的情況為零)

第三十,當一個物件被當作引數傳遞到一個方法後,此方法可改變這個物件的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞?

是值傳遞。Java程式語言中只有由值傳遞引數的。當一個物件例項作為一個引數被傳遞到方法中時,引數的值就是該物件的引用。物件的內容可以在被呼叫的方法中改變,但物件的引用是永遠不會改變的。

 

值傳遞:(形式引數型別是基本資料型別):方法呼叫時,實際引數把它的值傳遞給對應的形式引數,形式引數只是用實際引數的值初始化自己的儲存單元內容,是兩個不同的儲存單元,所以方法執行中形式引數值的改變不影響實際引數的值。

引用傳遞(形式引數型別是引用資料型別引數):也稱為傳地址。方法呼叫時,實際引數是物件(或陣列),這時實際引數與形式引數指向同一個地址,在方法執行中,對形式引數的操作實際上就是對實際引數的操作,這個結果在方法結束後被保留了下來,所以方法執行中形式引數的改變將會影響實際引數。

 

第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String?

Java 5以前,switch()中,只能是byteshortcharint。從Java 5開始,Java中引入了列舉型別,也可以是enum(列舉)型別,從Java 7開始,還可以是字串(String),但是長整型(long)在目前所有的版本中都是不可以的。

 

第三十二,程式設計題: 寫一個Singleton單例出來。

 

在單例模式中分為懶漢模式和餓漢模式

 

懶漢:

public class A{

private A(){}

private static A instance;

 

public statice A getinstance(){

If(instance==null){

instance=new A();

}

return instance;

}

}

 

餓漢:

public class B{

private B(){}

 

private statice B sing=new B();

 

public static B insten(){

return sing;

}

}