精品一区二区中文在线,无遮挡h肉动漫在线观看,国产99视频精品免视看9,成全免费高清大全

來自投資銀行的20個Java面試題

時間:2024-07-16 00:06:17 學人智庫 我要投稿
  • 相關推薦

來自投資銀行的20個Java面試題

  下面這篇來自投資銀行的20個Java面試題是CN人才網小編驚險為您推薦,歡迎參考閱讀。

來自投資銀行的20個Java面試題

  問題一:在多線程環境中使用HashMap會有什么問題?在什么情況下使用get()方法會產生無限循環?

  HashMap本身沒有什么問題,有沒有問題取決于你是如何使用它的。比如,你在一個線程里初始化了一個HashMap然后在多個其他線程里對其進行讀取,這肯定沒有任何問題。有個例子就是使用HashMap來存儲系統配置項。當有多于一個線程對HashMap進行修改操作的時候才會真正產生問題,比如增加、刪除、更新鍵值對的時候。因為put()操作可以造成重新分配存儲大小(re-sizeing)的動作,因此有可能造成無限循環的發生,所以這時需要使用Hashtable或者ConcurrentHashMap,而后者更優。

  問題二:不重寫Bean的hashCode()方法是否會對性能帶來影響?

  這個問題非常好,每個人可能都會有自己的體會。按照我掌握的知識來說,如果一個計算hash的方法寫得不好,直接的影響是,當向HashMap中添加元素的時候會更頻繁地造成沖突,因此最終增加了耗時。但是自從Java 8開始,這種影響不再像前幾個版本那樣顯著了,因為當沖突的發生超出了一定的限度之后,鏈表類的實現將會被替換成二叉樹(binary tree)實現,這時你仍可以得到O(logN)的開銷,優于鏈表類的O(n)。

  問題三:對于一個不可修改的類,它的每個對象是不是都必須聲明成final的?

  不盡然,因為你可以通過將成員聲明成非final且private,并且不要在除了構造函數的其他地方來修改它。不要為它們提供setter方法,同時不會通過任何函數泄露出對此成員的引用。需要記住的是,把對象聲明成final僅僅保證了它不會被重新賦上另外一個值,你仍然可以通過此引用來修改引用對象的屬性。這一點是關鍵,面試官通常喜歡聽到你強調這一點。

  問題四:String的substring()方法內部是如何實現的?

  又一個Java面試的好問題,你應該答出“substring方法通過原字符串創建了一個新的對象”,否則你的回答肯定是不能令人滿意的。這個問題也經常被拿來測試應聘者對于substring()可能帶來的內存泄漏風險是否有所了解。直到Java 1.7版本之前,substring會保存一份原字符串的字符數組的引用,這意味著,如果你從1GB大小的字符串里截取了5個字符,而這5個字符也會阻止那1GB內存被回收,因為這個引用是強引用。

  到了Java 1.7,這個問題被解決了,原字符串的字符數組已經不再被引用,但是這個改變也使得substring()創建字符串的操作更加耗時,以前的開銷是O(1),現在最壞情況是O(n)。

  substring

  問題五:能否寫一個單例模式,并且保證實例的唯一性?

  這算是Java一個比較核心的問題了,面試官期望你能知道在寫單例模式時應該對實例的初始化與否進行雙重檢查。記住對實例的聲明使用Volatile關鍵字,以保證單例模式是線程安全的。下面是一段示例,展示了如何用一種線程安全的方式實現了單例模式:

  public class Singleton {

  private static volatile Singleton _instance;

  /**

  * Double checked locking code on Singleton

  * @return Singelton instance

  */

  public static Singleton getInstance() {

  if (_instance == null) {

  synchronized (Singleton.class) {

  if (_instance == null) {

  _instance = new Singleton();

  }

  }

  }

  return _instance;

  }

  }

  問題六:你在寫存儲過程或者在Java里調用存儲過程的時候如何來處理錯誤情況?

  這是個很棘手的Java面試題,答案也并不固定。我的答案是,寫存儲過程的時候一旦有操作失敗,則一定要返回錯誤碼。但是在調用存儲過程的時候出錯的話捕捉SQLException卻是唯一能做的。

  問題七:Executor.submit()和Executor.execute()這兩個方法有什么區別?

  此問題來自另外一篇文章,《15個最流行的java多線程面試問題》,現在對熟練掌握并發技能的開發者的需求越來越大,因此這個問題也越來越引起大家的重視。答案是:前者返回一個Future對象,可以通過這個對象來獲得工作線程執行的結果。

  當我們考察異常處理的時候,又會發現另外一個不同。當你使用execute提交的任務拋出異常時,此異常將會交由未捕捉異常處理過程來處理(uncaught exception handler),當你沒有顯式指定一個異常處理器的話,默認情況下僅僅會通過System.err打印出錯誤堆棧。當你用submit來提交一個任務的時候,這個任務一旦拋出異常(無論是否是運行時異常),那這個異常是任務返回對象的一部分。對這樣一種情形,當你調用Future.get()方法的時候,這個方法會重新拋出這個異常,并且會使用ExecutionException進行包裝。

  問題八:工廠模式和抽象工廠模式有何不同?

  抽象工廠模式提供了多一級的抽象。不同的工廠類都繼承了同一個抽象工廠方法,但是卻根據工廠的類別創建不同的對象。例如,AutomobileFactory, UserFactory, RoleFactory都繼承了AbstractFactory,但是每個工廠類創建自己對應類型的對象。下面是工廠模式和抽象工廠模式對應的UML圖。

  Factory

【來自投資銀行的20個Java面試題】相關文章:

java面試題及答案10-03

10個經典的Java面試題集合09-20

Microsoft面試題09-04

iOS面試題07-10

公司面試題09-12

hibernate面試題10-18

英語面試題精選06-13

小升初面試題06-10

PHP面試題10-14

小升初面試題型08-24