現(xiàn)在的銀行早已經(jīng)有了自己成熟穩(wěn)定的信息化團(tuán)隊(duì),自然也成為了不少技術(shù)人員求職的好去處。很多Java開發(fā)人員樂于向花旗銀行、巴克萊銀行,瑞士信貸銀行提交申請(qǐng),但很多人可能還不清楚面試時(shí)可能會(huì)被問到哪些問題。
思誠(chéng)科技分享了投資銀行的一些常見面試問題,主要針對(duì)3年以上工作經(jīng)驗(yàn)的Java開發(fā)人員,這些問題不適用于新手或具有1-2年Java經(jīng)驗(yàn)的人員。
不保證一定會(huì)被問到,但這個(gè)列表你可以嘗試看看:
問題1:在多線程環(huán)境中使用HashMaps有什么問題?get()方法何時(shí)進(jìn)入無(wú)限循環(huán)?
答:沒有什么方法是錯(cuò)誤的——這取決于程序員如何使用它。例如,如果只使用一個(gè)線程初始化HashMap,并且所有線程都只能從中讀取,那么這非常好。其中一個(gè)例子是包含配置屬性的Map。當(dāng)不止一個(gè)線程正在更新HashMap,即添加,更改或刪除任何鍵值對(duì)時(shí),真正的問題就開始了。
由于put()操作可能會(huì)導(dǎo)致重新調(diào)整大小,從而導(dǎo)致無(wú)限循環(huán),這就是為什么要使用Hashtable或ConcurrentHashMap(后者更好)。
問題2:不覆蓋hashCode()方法是否有任何性能影響?
答案:這是一個(gè)很好的問題,幾乎會(huì)問所有面試者。一個(gè)糟糕的hashCode函數(shù)會(huì)導(dǎo)致HashMap中頻繁的沖突,最終增加向HashMap中添加對(duì)象的時(shí)間。
然而,從Java8開始,沖突不會(huì)像早期版本那樣影響性能。因?yàn)樵陂撝抵,鏈接列表將被二叉樹替換,這在最壞的情況下時(shí)間復(fù)雜度還可以達(dá)到O(logN)。
這個(gè)問題有時(shí)難以回答,是因?yàn)樵S多開發(fā)人員只知道equals和hashcode契約,并沒有考慮它們的性能影響。
equals和hashcode契約:
1.如果兩個(gè)對(duì)象相等,它們的hashcode必須相等;
2.如果兩個(gè)對(duì)象的hashcode相等,這兩個(gè)對(duì)象不一定相等。
問題3:不可變對(duì)象的所有屬性都必須是final嗎?
答:不必要。如上所述,可以不是final而是private-不是在構(gòu)造函數(shù)中修改它們來(lái)實(shí)現(xiàn)相同的功能,不要為它們提供setter方法。如果是一個(gè)可變對(duì)象,永遠(yuǎn)不要泄露對(duì)該成員的任何引用。
請(qǐng)記住,變量屬性設(shè)為final僅確保它不會(huì)被重新分配不同的值,但仍可以更改該引用變量所指向的對(duì)象的各個(gè)屬性。這是面試官希望從候選人那里聽到的關(guān)鍵點(diǎn)之一。提到這一點(diǎn),就可以得到一些分?jǐn)?shù)。
問題4:String中的substring()如何工作?
答:許多開發(fā)人員知道答案:“子字符串通過獲取原始字符串的一部分,從原字符串中創(chuàng)建一個(gè)新對(duì)象。”
但我認(rèn)為這個(gè)答案是不夠的。這個(gè)問題的目的在于看看開發(fā)人員是否熟悉子串可能產(chǎn)生的內(nèi)存泄漏風(fēng)險(xiǎn)。
在Java1.7之前,一個(gè)保存了原始字符數(shù)組引用的子字符串,意味著5個(gè)字符長(zhǎng)的子字符串也可以通過保留強(qiáng)引來(lái)阻止垃圾收集中的1GB字符數(shù)組。
這個(gè)問題在Java1.7中得到了修復(fù),原來(lái)的字符數(shù)組不再被引用,但是這種改變也使得創(chuàng)建子字符串在時(shí)間上成本更高。早些時(shí)候,它在O(1)范圍內(nèi),在Java7最壞的情況下可能是O(N)。
問題5:你能為singleton編寫關(guān)鍵部分代碼嗎?
答:這個(gè)核心Java問題是前一個(gè)問題的后續(xù),希望面試者使用雙重檢查鎖定模式編寫Java單例,請(qǐng)記住使用volatile變量來(lái)使Singleton線程安全。
問題6:在編寫存儲(chǔ)過程或從Java訪問存儲(chǔ)過程時(shí),如何處理錯(cuò)誤條件?
答:這是Java面試題中幾乎對(duì)所有人開放的問題。如果某個(gè)操作失敗,存儲(chǔ)過程應(yīng)該返回一個(gè)錯(cuò)誤代碼,但如果存儲(chǔ)過程本身失敗,那么捕獲SQLException是唯一的選擇。
問題7:Executor.submit()和Executer.execute()方法有什么區(qū)別?
這個(gè)問題來(lái)自投資銀行針對(duì)有經(jīng)驗(yàn)的程序員的50個(gè)Java多線程問題列表。
由于擁有良好并發(fā)技能的Java開發(fā)人員的巨大需求,它日益普及。順便說(shuō)一句,如果想認(rèn)真構(gòu)建并發(fā)技能,那么HeinzKabutz的JavaConcurrencyinPractice課程是一個(gè)很好的開始。它是關(guān)于Java并發(fā)的最高級(jí)課程之一,也是基于BrianGoetz和其公司的經(jīng)典書籍JavaConcurrencyinPractice。
這個(gè)Java面試問題的答案是前者返回一個(gè)Future對(duì)象,它可以用來(lái)從worker線程中查找結(jié)果。查看異常處理時(shí)有區(qū)別。如果任務(wù)拋出一個(gè)異常(如果是在執(zhí)行時(shí)提交的),這個(gè)異常將進(jìn)入未捕獲的異常處理程序(當(dāng)沒有顯式提供異常時(shí),默認(rèn)只會(huì)將堆棧跟蹤打印到System.err)。
如果在提交任何拋出異常時(shí)提交了任務(wù),則檢查異常與否,這是任務(wù)返回狀態(tài)的一部分。對(duì)于已提交并以異常終止的任務(wù),F(xiàn)uture.get()將重新拋出此異常,并包裝在ExecutionException中。
問題8:Factory和AbstractFactory模式有什么區(qū)別?
與Factory模式相比,AbstractFactory提供了更多級(jí)別的抽象。
考慮不同的Factory,每個(gè)Factory都從AbstractFactory擴(kuò)展而來(lái),負(fù)責(zé)根據(jù)Factory類型創(chuàng)建不同的對(duì)象層次結(jié)構(gòu)。
例如,AbstractFactory可以通過AutomobileFactory,UserFactory,RoleFactory等進(jìn)行擴(kuò)展。
每個(gè)Factory都將負(fù)責(zé)創(chuàng)建該類型的對(duì)象。
問題9:什么是Singleton?讓整個(gè)方法同步還是只有關(guān)鍵部分同步更好?
答:Java中的Singleton是在整個(gè)Java應(yīng)用程序中只有一個(gè)實(shí)例的類。例如,java.lang.Runtime是一個(gè)Singleton類。
在Java5之前創(chuàng)建Singleton是棘手的,自從Java5引入Enum,它變得非常容易。
這個(gè)問題需要程序員了解使用Enums編寫單例和使用雙重檢查鎖定的一些細(xì)節(jié),這是此Java面試問題的目的。
問題10:你能編寫用于在Java4和Java5中迭代HashMaps的代碼嗎?
答:這是一個(gè)棘手問題,程序員可以設(shè)法使用while和for循環(huán)。但實(shí)際上,有幾種方法可以遍歷Java中的所有Map。
第一種方法涉及使用keySet()并迭代該鍵,然后使用get()方法檢索值,這有點(diǎn)貴。
第二種方法涉及使用entrySet()并遍歷它們,方法是使用for循環(huán)或使用Iterator.hasNext()方法。這個(gè)方法更好。因?yàn)樵诘^程中key和value對(duì)象都可用,并且不需要調(diào)用get()方法來(lái)檢索值,這可以提供O(N)性能。
如果使用Java8并且有樹而不是鏈接列表,可能會(huì)稍微好一點(diǎn)。
結(jié)論
這就是投資銀行常見的Java面試問題。如果你正在尋找Java開發(fā)人員相關(guān)崗位,那么應(yīng)該多了解Java并發(fā)性,多線程,集合,JVM內(nèi)部結(jié)構(gòu),垃圾回收以及如何提高Java應(yīng)用程序的性能。
關(guān)于我們
產(chǎn)品與平臺(tái)
企業(yè)信息咨詢