程序員經典面試題及答案2

1、HashMap和Hashtable的區別。

  HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在於HashMap允許空(null)鍵值(key),由於非線程安全,效率上可能高於Hashtable。

  HashMap允許將null作爲一個entry的key或者value,而Hashtable不允許。

  HashMap 把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因爲contains方法容易讓人引起誤 解。 Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。

  最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己爲它的方法實現同步,而HashMap 就必須爲之提供外同步。

  Hashtable和HashMap採用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。

  2、final, finally, finalize的區別。

  final 用於聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。finally是異常處理語句結構的一部分,表示總是執行。finalize是 Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。

  3、sleep() 和 wait() 有什麼區別?

  sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時後會自動恢復。調用 sleep不會釋放對象鎖。wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對 象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。

  4、Overload和Override的區別。

  Overloaded的方法是否可以改變返回值的類型?

  方法的重寫Overriding 和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一 個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方 法,它們或有不同的參數個數或有不同的參數類型,則稱爲方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

  5、error和exception有什麼區別?

  error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。

  exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。

  6、Math.round(11.5)等於多少?

  Math.round(-11.5)等於多少? Math.round(11.5)==12 Math.round(-11.5)==-11 round方法返回與參數最接近的長整數,參數加1/2後求其floor.

  7、GC是什麼? 爲什麼要有GC?

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

  8、設計4個線程,其中兩個線程每次對j增加1,另外兩個線程對j每次減少1。寫出程序。

  以下程序使用內部類實現線程,對j增減的時候沒有考慮順序問題。

  public class ThreadTest1{private int j; public static void main(String args[]){ ThreadTest1 tt=new ThreadTest1(); Inc inc=tt.new Inc(); Dec dec=tt.new Dec(); for(int i=0;i<2;i++){ Thread t=new Thread(inc); t.start(); t=new Thread(dec); t.start(); } } private synchronized void inc(){ j++; System.out.println(Thread.currentThread().getName()+"-inc:"+j); }

  private synchronized void dec(){ j--; System.out.println(Thread.currentThread().getName()+"-dec:"+j); }

  class Inc implements Runnable{ public void run(){ for(int i=0;i<100;i++){ inc(); } } } class Dec implements Runnable{public void run(){ for(int i=0;i<100;i++){ dec(); } } } }

  9、JSP中動態INCLUDE與靜態INCLUDE的區別?

  動態INCLUDE用jsp:include動作實現 它總是會檢查所含文件中的變化,適合用於包含動態頁面,並且可以帶參數。靜態INCLUDE用include僞碼實現,定不會檢查所含文件的變 化,適用於包含靜態頁面<%@ include file="included.htm" %>

  10、什麼時候用assert。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章