銀行java開發(fā)筆試面試題13道(含答案)
1、在多線程環(huán)境中使用HashMap會有什么問題?在什么情況下使用get()方法會產(chǎn)生無限循環(huán)?
HashMap本身沒有什么問題,有沒有問題取決于你是如何使用它的。比如,你在一個線程里初始化了一個HashMap然后在多個其他線程里對其進行讀取,這肯定沒有任何問題。有個例子就是使用HashMap來存儲系統(tǒng)配置項。當有多于一個線程對HashMap進行修改操作的時候才會真正產(chǎn)生問題,比如增加、刪除、更新鍵值對的時候。因為put()操作可以造成重新分配存儲大?。╮e-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來使用的話,你也必須重寫這兩個方法?,F(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)。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
- 這篇文章主要介紹了15個Java線程并發(fā)面試題和答案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-08-27
這篇文章主要介紹了10個最難回答的Java面試題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-08-07
史上最全的Java面試題總匯(不再懼怕面試官,成功坐等offer)
這篇文章主要介紹了史上最全的Java面試題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-08-07
你要的Java并發(fā)面試題都在這里,20000字答案解析(小結(jié))
這篇文章主要介紹了你要的Java并發(fā)面試題都在這里,20000字答案解析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-07-31Java研發(fā)面試99題(含答案):JVM+Spring+MySQL+線程池+鎖
這篇文章主要介紹了Java研發(fā)面試99題,主要包括了JVM,Spring,MySQL,線程池,鎖等,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-07-16
JS 初學者總是對this關(guān)鍵字感到困惑,因為與其他現(xiàn)代編程語言相比,JS 中的這this關(guān)鍵字有點棘手。今天小編給大家?guī)?0個比較流行的JavaScript面試題 ,感興趣的朋友一起2019-07-122019校招Java 開發(fā)崗面試知識點解析(附最新筆面試題)
這篇文章主要介紹了2019校招Java 開發(fā)崗面試知識點解析(附最新筆面試題),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-27
這篇文章主要介紹了面試必備之Java 最常見 200+ 面試題全解析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-132019年成功入職阿里:阿里的三套Java研發(fā)崗面試題總結(jié)
之前過了幾個簡單的簡歷面,所以總結(jié)了幾套面試的試題供大家分享。小編覺得挺不錯的,也給大家做個參考。一起跟隨小編過來看看吧2019-04-25金九銀十,各大互聯(lián)網(wǎng)公司Java面試題合集
又到了面試求職高峰期,最近有很多網(wǎng)友都在求大廠面試題。這些題目是網(wǎng)友去百度、小米、樂視、美團、58、獵豹、360、新浪、搜狐等一線互聯(lián)網(wǎng)公司面試被問到的題目,發(fā)上來2019-04-24






