摘要:本文介紹一些來自投資銀行的針對三年以上經驗的開發人員面試題。第七題和這兩個方法有什么不同答案本題取自我的投資銀行針對有經驗的開發者的五十個多線程面試題列表。總結以上就是投資銀行通常會出的面試題。
原文地址: https://dzone.com/articles/10...
有為數不少的開發者希望能在像 Barclays、Credit Suisse、Citibank 等等那樣的投資銀行做 Java 開發工作,但是他們當中很多不知道自己會遇到什么樣的面試題。
本文介紹一些來自投資銀行的、針對三年以上經驗的 Java 開發人員面試題。之所以不針對兩年經驗或以下的新手程序員,是因為投資銀行通常會從畢業生那里去招這種水平的人,而不是通過社招。
也不是說這些問題一定會問到,只是給你一個印象,實際面試的時候會以哪些方面的題目為主。
當然,準備做得越充足就越好,所以如果這十道題對你來講還不夠,那么可以再看看電話面試四十題。這里還有一個兩百多道題的大餐(譯注:這是在線課程廣告鏈接。后面的廣告鏈接我都將去除)等著你。
? 第一題:多線程環境中使用 HashMap 會出現什么問題?什么情況下 get() 方法會陷入無限循環?(答案)怎么說呢,不管什么東西,只要用對了就不會有問題。比如說一個 HashMap,你只用一個線程初始化,然后所有的線程都對它只讀,那是完全沒問題的。
一個典型例子就是包含配置屬性的 Map 對象。如果有線程開始去寫這個 Map,去添加、修改或刪除里面的鍵值對,哪怕只有一個線程,問題就來了。
put() 方法可能會觸發它內部的容量大小變更(re-sizing),這個過程可能會造成無限循環,這就是為什么你應該換用 Hashtable 或 ConcurrentHashMap(后者更佳)。
譯注:關于 HashMap 陷入無限循環的可能,請參考這篇文章。? 第二題:覆寫 hashCode() 方法會不會對性能有影響?(答案)
這個問題很棒,也很開放。據我所知,hashCode() 方法實現的不好,可能會導致 HashMap 頻繁出現沖突,增加了將對象放入 HashMap 的耗時。
不過從 Java 8 開始這種情況有所改善,因為沖突到達一定級別后,HashMap 會改用二叉樹而不是鏈表來保存內容,這樣時間復雜度就從 O(N) 降低到了 O(log N)。
這個問題屬于比較刁鉆的面試題之一,很多開發者只知道 hashCode() 和 equals() 之間的關系,不會想到性能方面可能出現的問題。
? 第三題:不可變對象的所有屬性都必須聲明為 final 嗎?(答案)不是必須的。成員可以聲明為 private 并且只在構造函數里面賦值,能達到同樣的效果。
關鍵是不要提供 setter 方法。如果該屬性是可變對象,還注意不要把它的引用泄露出去。
記住,將一個引用變量聲明為 final 僅表示不允許對該變量重新賦值,你仍然可以修改該變量值自身的屬性。如果求職者能夠把問題闡明到這個層次,在面試官面前還能多拿點印象分哦。
? 第四題:String 的 substring() 方法的原理是什么?(答案)很多開發人員會說:“這個方法就是從原始字符串中取出一部分,作為新的 String 對象返回。”
這樣是沒回答到點子上的,因為這個問題實際上是在考察你是否熟悉 substring() 方法造成內存泄漏的風險。
在 Java 1.7 之前,substring() 方法的返回值會持有原始字符串的引用,導致原始字符串無法被回收,也就是說,哪怕 substring() 返回的字符串只有 5 個字節,也會令原始大小 1GB 的字符串無法回收。
從 Java 1.7 開始這個問題被修復了,substring() 方法的返回值不再引用原始字符串,不過相應的代價是執行時間有所增加,時間復雜度從之前的 O(1) 增加到最壞情形下的 O(N)。
? 第五題:你能寫出單例模式的關鍵代碼嗎?(答案)本題屬于 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() 和 Executer.execute() 這兩個方法有什么不同?(答案)本題取自我的 “投資銀行針對有經驗的開發者的 五十個 Java 多線程面試題 列表”。這類問題越來越流行,因為企業對熟練掌握多線程開發的程序員的需求越來越多。如果你想認真打造自己的并發編程技能,我這里順便推薦一下 Heinz Kabutz 的 Java 多線程實戰課程。
回到本題,前者返回的是一個 Future 對象,它用來從 Worker 線程中獲取處理結果。(譯注:后者即 execute() 方法沒有返回值)
還有一個區別就是對異常的處理。當 execute() 執行的任務發生異常時,該異常會進入未捕獲異常處理流程(如果你沒有提供自己的處理方式,則會從 System.err 將異常信息打印出來)。
當 submit() 執行的任務發生異常時,該異常會成為返回值的一部分。如果任務因為異常而結束運行,那么當調用 Future.get() 方法獲取返回值時,這個異常會被包裝在 ExecutionException 中再次拋出。
? 第八題:工廠(Factory)模式和抽象工廠(Abstract Factory)模式有什么區別?(答案)抽象工廠模式比工廠模式多了一層抽象。
一個抽象工廠可以有多個不同的實現,它們各自負責創建不同種類的實際對象。如下圖所示:
? 第九題:什么是單例?是用 synchronized 修飾整個方法更好,還是在方法里面用同步塊更好?(答案)單例就是指某個類在整個 Java 應用當中只有一個實例對象。比如 java.lang.Runtime 就是一個單例的類。在 Java 5 之前,設計單例類要非常小心容易出錯,但自從 Java 5 引進了枚舉之后,事情變得輕松多了。
請參考本人的文章 如何編寫線程安全的單例,該文詳細介紹了如何使用枚舉或雙重鎖定檢查模式來實現單例,這也是本面試題的目的所在。
? 第十題:在 Java 4 和 Java 5 中如何遍歷 HashMap?(答案)這個題目也比較刁鉆,上面的答案給出了使用 while 和 for 循環來進行遍歷的例子。實際上,在 Java 中遍歷 Map 有四種方法。(譯注:分別是 for-keyset、while-keyset、for-entryset 和 while-entryset)
遍歷 keySet() 然后對每個 key 調用 get() 方法來取值,這種方式相對效率較低。
另一種方式就是遍歷 entrySet(),然后直接從 Entry 中取 key 或 value。這種方式效率較高,因為你無需再調用 get() 方法取值。如果該方法遇到了較長的鏈表(譯注:參考第二題),時間復雜度將會變成 O(N),雖然在 Java 8 中情況會稍微好點,因為 Java 8 會用二叉樹代替鏈表。
總結以上就是投資銀行通常會出的 Java 面試題。如果你想在當中謀個 Java 開發者職位,那么請做好面對大量有關 Java 多線程、并發、集合、JVM 內部實現、垃圾收集,以及 Java 應用性能調優的各種問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71011.html
摘要:再者,現在互聯網的面試中上點的都會涉及一下或者的問題個高級多線程面試題及回答后端掘金在任何面試當中多線程和并發方面的問題都是必不可少的一部分。假如源碼分析之掘金概念是中集合的一種實現。 攻破 JAVA NIO 技術壁壘 - 后端 - 掘金現在使用NIO的場景越來越多,很多網上的技術框架或多或少的使用NIO技術,譬如Tomcat,Jetty。學習和掌握NIO技術已經不是一個JAVA攻城獅...
摘要:基礎知識復習后端掘金的作用表示靜態修飾符,使用修飾的變量,在中分配內存后一直存在,直到程序退出才釋放空間。將對象編碼為字節流稱之為序列化,反之將字節流重建成對象稱之為反序列化。 Java 學習過程|完整思維導圖 - 后端 - 掘金JVM 1. 內存模型( 內存分為幾部分? 堆溢出、棧溢出原因及實例?線上如何排查?) 2. 類加載機制 3. 垃圾回收 Java基礎 什么是接口?什么是抽象...
摘要:個高級多線程面試題及回答后端掘金在任何面試當中多線程和并發方面的問題都是必不可少的一部分。目前在生產環基于的技術問答網站系統實現后端掘金這一篇博客將詳細介紹一個基于的問答網站的實現,有詳細的代碼。 15 個高級 Java 多線程面試題及回答 - 后端 - 掘金在任何Java面試當中多線程和并發方面的問題都是必不可少的一部分。如果你想獲得任何股票投資銀行的前臺資訊職位,那么你應該準備很多...
摘要:個高級多線程面試題及回答后端掘金在任何面試當中多線程和并發方面的問題都是必不可少的一部分。目前在生產環基于的技術問答網站系統實現后端掘金這一篇博客將詳細介紹一個基于的問答網站的實現,有詳細的代碼。 15 個高級 Java 多線程面試題及回答 - 后端 - 掘金在任何Java面試當中多線程和并發方面的問題都是必不可少的一部分。如果你想獲得任何股票投資銀行的前臺資訊職位,那么你應該準備很多...
閱讀 1176·2021-10-11 10:59
閱讀 1962·2021-09-29 09:44
閱讀 852·2021-09-01 10:32
閱讀 1423·2019-08-30 14:21
閱讀 1869·2019-08-29 15:39
閱讀 2972·2019-08-29 13:45
閱讀 3531·2019-08-29 13:27
閱讀 2005·2019-08-29 12:27