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