天天大廠我也遭不住啊暑认!來困介!13道樸實的銀行Java開發(fā)筆試面試題(含答案)

前言:

最近有網(wǎng)友后臺私信我,你天天更新的不是大廠就還是TM的大廠蘸际,整的我看到那些面試題一臉懵逼座哩,都沒有信心了。現(xiàn)在我都水平有限粮彤,有沒有樸實一點的面試題提供參考一下啊根穷。

好的,今天他來了

在這里插入圖片描述

1导坟、在多線程環(huán)境中使用HashMap會有什么問題屿良?在什么情況下使用get()方法會產(chǎn)生無限循環(huán)?

HashMap本身沒有什么問題惫周,有沒有問題取決于你是如何使用它的尘惧。比如,你在一個線程里初始化了一個HashMap然后在多個其他線程里對其進行讀取递递,這肯定沒有任何問題喷橙。有個例子就是使用HashMap來存儲系統(tǒng)配置項。當有多于一個線程對HashMap進行修改操作的時候才會真正產(chǎn)生問題漾狼,比如增加重慢、刪除、更新鍵值對的時候逊躁。因為put()操作可以造成重新分配存儲大小(re-sizeing)的動作隅熙,因此有可能造成無限循環(huán)的發(fā)生稽煤,所以這時需要使用Hashtable或者ConcurrentHashMap核芽,而后者更優(yōu)。

2酵熙、不重寫B(tài)ean的hashCode()方法是否會對性能帶來影響轧简?

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

3染服、對于一個不可修改的類别洪,它的每個對象是不是都必須聲明成final的?

不盡然柳刮,因為你可以通過將成員聲明成非final且private蕉拢,并且不要在除了構(gòu)造函數(shù)的其他地方來修改它。不要為它們提供setter方法诚亚,同時不會通過任何函數(shù)泄露出對此成員的引用晕换。需要記住的是,把對象聲明成final僅僅保證了它不會被重新賦上另外一個值站宗,你仍然可以通過此引用來修改引用對象的屬性闸准。這一點是關(guān)鍵,面試官通常喜歡聽到你強調(diào)這一點梢灭。

4夷家、String的substring()方法內(nèi)部是如何實現(xiàn)的?

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

5兄墅、你在寫存儲過程或者在Java里調(diào)用存儲過程的時候如何來處理錯誤情況踢星?

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

6、Java 中新的 Lock 接口相對于同步代碼塊(synchronized block)有什么優(yōu)勢概荷?如果讓你實現(xiàn)一個高性能緩存秕岛,支持并發(fā)讀取和單一寫入,你如何保證數(shù)據(jù)完整性误证。

多線程和并發(fā)編程中使用 lock 接口的最大優(yōu)勢是它為讀和寫提供兩個單獨的鎖继薛,可以讓你構(gòu)建高性能數(shù)據(jù)結(jié)構(gòu),比如 ConcurrentHashMap 和條件阻塞愈捅。
這道 Java 線程面試題越來越多見遏考,而且隨后的面試題都基于面試者對這道題的回答。
我強烈建議在任何 Java 多線程面試前都要多看看有關(guān)鎖的知識蓝谨,因為如今電子交易系統(tǒng)的客戶端和數(shù)據(jù)交互中灌具,鎖被頻繁使用來構(gòu)建緩存。

7譬巫、Executor.submit()和Executor.execute()這兩個方法有什么區(qū)別咖楣?

前者返回一個Future對象,可以通過這個對象來獲得工作線程執(zhí)行的結(jié)果芦昔。
當我們考察異常處理的時候诱贿,又會發(fā)現(xiàn)另外一個不同。當你使用execute提交的任務(wù)拋出異常時咕缎,此異常將會交由未捕捉異常處理過程來處理(uncaught exception handler)珠十,當你沒有顯式指定一個異常處理器的話,默認情況下僅僅會通過System.err打印出錯誤堆棧凭豪。當你用submit來提交一個任務(wù)的時候焙蹭,這個任務(wù)一旦拋出異常(無論是否是運行時異常),那這個異常是任務(wù)返回對象的一部分嫂伞。對這樣一種情形孔厉,當你調(diào)用Future.get()方法的時候拯钻,這個方法會重新拋出這個異常,并且會使用ExecutionException進行包裝烟馅。

8说庭、能否寫一段用Java 4或5來遍歷一個HashMap的代碼然磷?

事實上郑趁,用Java可以有四種方式來遍歷任何一個Map,一種是使用keySet()方法獲取所有的鍵姿搜,然后遍歷這些鍵寡润,再依次通過get()方法來獲取對應(yīng)的值。第二種方法可以使用entrySet()來獲取鍵值對的集合舅柜,然后使用for each語句來遍歷這個集合梭纹,遍歷的時候獲得的每個鍵值對已經(jīng)包含了鍵和值。這種算是一種更優(yōu)的方式致份,因為每輪遍歷的時候同時獲得了key和value变抽,無需再調(diào)用get()方法,get()方法在那種如果bucket位置有一個巨大的鏈表的時候的性能開銷是O(n)氮块。第三種方法是獲取entrySet之后用iterator依次獲取每個鍵值對绍载。第四種方法是獲得key set之后用iterator依次獲取每個key,然后再根據(jù)key來調(diào)用get方法滔蝉。

9击儡、你在什么時候會重寫hashCode()和equals()方法?

當你需要根據(jù)業(yè)務(wù)邏輯來進行相等性判斷蝠引、而不是根據(jù)對象相等性來判斷的時候你就需要重寫這兩個函數(shù)了阳谍。例如,兩個Employee對象相等的依據(jù)是它們擁有相同的emp_id螃概,盡管它們有可能是兩個不同的Object對象矫夯,并且分別在不同的地方被創(chuàng)建。同時吊洼,如果你準備把它們當作HashMap中的key來使用的話训貌,你也必須重寫這兩個方法。現(xiàn)在融蹂,作為Java中equals-hashcode的一個約定旺订,當你重寫equals的時候必須也重寫hashcode,否則你會打破諸如Set, Map等集合賴以正常工作的約定超燃。你可以看看我的另外一篇博文來理解這兩個方法之間的微妙區(qū)別與聯(lián)系区拳。

10、如果不重寫hashCode方法會有什么問題意乓?

如果不重寫equals方法的話樱调,equals和hashCode之間的約定就會被打破:當通過equals方法返回相等的兩個對象约素,他們的hashCode也必須一樣。如果不重寫hashCode方法的話笆凌,即使是使用equals方法返回值為true的兩個對象圣猎,當它們插入同一個map的時候,因為hashCode返回不同所以仍然會被插入到兩個不同的位置乞而。這樣就打破了HashMap的本來目的送悔,因為Map本身不允許存進去兩個key相同的值。當使用put方法插入一個的時候爪模,HashMap會先計算對象的hashcode欠啤,然后根據(jù)它來找到存儲位置(bucket),然后遍歷此存儲位置上所有的Map.Entry對象來查看是否與待插入對象相同屋灌。如果沒有提供hashCode的話洁段,這些就都做不到了。

11共郭、HashMap祠丝,在調(diào)用get()方法的時候equals()和hashCode()方法都起了什么樣的作用?

應(yīng)聘者應(yīng)該知道的是除嘹,一旦你提到了hashCode()方法写半,人們很可能要問HashMap是如何使用這個函數(shù)的。當你向HashMap插入一個key的時候憾赁,首先污朽,這個對象的hashCode()方法會被調(diào)用,調(diào)用結(jié)果用來計算將要存儲的位置(bucket)龙考。

因為某個位置上可能以鏈表的方式已經(jīng)包含了多個Map.Entry對象蟆肆,所以HashMap會使用equals()方法來將此對象與所有這些Map.Entry所包含的key進行對比,以確定此key對象是否已經(jīng)存在晦款。

12炎功、在Java中如何避免死鎖?

你可以通過打破互相等待的局面來避免死鎖缓溅。為了達到這一點蛇损,你需要在代碼中合理地安排獲取和釋放鎖的順序。如果獲得鎖的順序是固定的坛怪,并且獲得的順序和釋放的順序剛好相反的話淤齐,就不會產(chǎn)生出現(xiàn)死鎖的條件了。

13袜匿、說說ClassLoader.loadClass()與Class.forName()的區(qū)別

ClassLoader.loadClass()與Class.forName()大家都知道是反射用來構(gòu)造類的方法更啄,但是他們的用法還是有一定區(qū)別的。
在講區(qū)別之前居灯,我覺得很有不要把類的加載過程在此整理一下祭务。
在Java中内狗,類裝載器把一個類裝入Java虛擬機中,要經(jīng)過三個步驟來完成:裝載义锥、鏈接和初始化柳沙,其中鏈接又可以分成校驗、準備和解析三步拌倍,除了解析外赂鲤,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:

  • 裝載:查找和導入類或接口的二進制數(shù)據(jù)贰拿;
  • 鏈接:執(zhí)行下面的校驗蛤袒、準備和解析步驟熄云,其中解析步驟是可以選擇的膨更;
  • 校驗:檢查導入類或接口的二進制數(shù)據(jù)的正確性;
  • 準備:給類的靜態(tài)變量分配并初始化存儲空間缴允;
  • 解析:將符號引用轉(zhuǎn)成直接引用荚守;
  • 初始化:激活類的靜態(tài)變量的初始化Java代碼和靜態(tài)Java代碼塊。

于是乎我們可以開始看2者的區(qū)別了练般。

Class.forName(className)方法矗漾,其實調(diào)用的方法是Class.forName(className,true,classloader);注意看第2個boolean參數(shù),它表示的意思薄料,在loadClass后必須初始化敞贡。比較下我們前面準備jvm加載類的知識,我們可以清晰的看到在執(zhí)行過此方法后摄职,目標對象的 static塊代碼已經(jīng)被執(zhí)行誊役,static參數(shù)也已經(jīng)被初始化。

再看ClassLoader.loadClass(className)方法谷市,其實他調(diào)用的方法是ClassLoader.loadClass(className,false);還是注意看第2個 boolean參數(shù)蛔垢,該參數(shù)表示目標對象被裝載后不進行鏈接,這就意味這不會去執(zhí)行該類靜態(tài)塊中間的內(nèi)容迫悠。因此2者的區(qū)別就顯而易見了鹏漆。

最后還有必要在此提一下new方法和newInstance方法的區(qū)別

  • newInstance: 弱類型。低效率创泄。只能調(diào)用無參構(gòu)造艺玲。
  • new: 強類型。相對高效鞠抑。能調(diào)用任何public構(gòu)造饭聚。

例如,在JDBC編程中碍拆,橙糁危看到這樣的用法慨蓝,Class.forName("com.mysql.jdbc.Driver"),如果換成了 getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver")端幼,就不行礼烈。
為什么呢?打開com.mysql.jdbc.Driver的源代碼看看

static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
} 

Driver在static塊中會注冊自己到j(luò)ava.sql.DriverManager婆跑。而static塊就是在Class的初始化中被執(zhí)行此熬。所以這個地方就只能用Class.forName(className)。

最后

針對最近很多人都在面試滑进,我這邊也整理了相當多的面試專題資料(spring犀忱、mybatis、jvm扶关。阴汇。。帶多了可以看附上的圖片)和多家公司的面試真題节槐。

上述的面試題答案都整理成文檔筆記搀庶。有需要的可以識別下面的圖獲取!備注:簡書

在這里插入圖片描述

上述的面試題答案都整理成文檔筆記。有需要的可以識別下面的圖獲取! 備注:簡書

有人可能會說了:面試真題你全部放上來就好了铜异。哥倔。。

你知道我最近整理了多少嗎揍庄?

上述的面試題答案都整理成文檔筆記咆蒿。 也還整理了一些面試資料&最新2020收集的一些大廠的面試真題(都整理成文檔,小部分截圖)蚂子,有需要的可以識別下面的圖獲取備注:簡書
image
在這里插入圖片描述

以上就是本文的全部內(nèi)容沃测,希望對大家的學習有所幫助,也希望大家多多支持缆镣。
[圖片上傳失敗...(image-a6f653-1599207048239)]

[圖片上傳失敗...(image-d38c79-1599207048239)]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芽突,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子董瞻,更是在濱河造成了極大的恐慌寞蚌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钠糊,死亡現(xiàn)場離奇詭異挟秤,居然都是意外死亡,警方通過查閱死者的電腦和手機抄伍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門艘刚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人截珍,你說我怎么就攤上這事攀甚÷崞樱” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵秋度,是天一觀的道長炸庞。 經(jīng)常有香客問我,道長荚斯,這世上最難降的妖魔是什么埠居? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮事期,結(jié)果婚禮上滥壕,老公的妹妹穿的比我還像新娘。我一直安慰自己兽泣,他們只是感情好绎橘,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撞叨,像睡著了一般金踪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牵敷,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音法希,去河邊找鬼枷餐。 笑死,一個胖子當著我的面吹牛苫亦,可吹牛的內(nèi)容都是我干的毛肋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屋剑,長吁一口氣:“原來是場噩夢啊……” “哼润匙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唉匾,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤孕讳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后巍膘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厂财,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年峡懈,在試婚紗的時候發(fā)現(xiàn)自己被綠了璃饱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖讹堤,靈堂內(nèi)的尸體忽然破棺而出笙各,到底是詐尸還是另有隱情纯丸,我是刑警寧澤挠阁,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布榛瓮,位于F島的核電站日杈,受9級特大地震影響律秃,放射性物質(zhì)發(fā)生泄漏嗤栓。R本人自食惡果不足惜冻河,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茉帅。 院中可真熱鬧叨叙,春花似錦、人聲如沸堪澎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽樱蛤。三九已至钮呀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昨凡,已是汗流浹背爽醋。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留便脊,地道東北人蚂四。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像哪痰,于是被迫代替她去往敵國和親遂赠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353