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