大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 來自交通銀行Java面試題目總結

來自交通銀行Java面試題目總結

更新時間:2020-01-16 16:19:18 來源:動力節點 瀏覽4650次


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


  當你需要根據業務邏輯來進行相等性判斷、而不是根據對象相等性來判斷的時候你就需要重寫這兩個函數了。例如,兩個Employee對象相等的依據是它們擁有相同的emp_id,盡管它們有可能是兩個不同的Object對象,并且分別在不同的地方被創建。同時,如果你準備把它們當作HashMap中的key來使用的話,你也必須重寫這兩個方法。現在,作為Java中equals-hashcode的一個約定,當你重寫equals的時候必須也重寫hashcode,否則你會打破諸如Set, Map等集合賴以正常工作的約定。你可以看看我的另外一篇博文來理解這兩個方法之間的微妙區別與聯系。


  如果不重寫hashCode方法會有什么問題?


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


  我們要同步整個getInstance()方法,還是只同步getInstance()方法中的關鍵部分?


  答案是:僅僅同步關鍵部分(Critical Section)。這是因為,如果我們同步整個方法的話,每次有線程調用getInstance()方法的時候都會等待其他線程調用完成才行,即使在此方法中并沒有執行對象的創建操作。換句話說,我們只需要同步那些創建對象的代碼,而創建對象的代碼只會執行一次。一旦對象創建完成之后,根本沒有必要再對方法進行同步保護了。事實上,從性能上來說,對方法進行同步保護這種編碼方法非常要命,因為它會使性能降低10到20倍。下面是單例模式的UML圖。


來自交通銀行Java面試題目總結


  再補充一下,創建線程安全的單例對象有多種方法,你也可以順便提一下。


  HashMap,在調用get()方法的時候equals()和hashCode()方法都起了什么樣的作用?


  這個問題算是對問題十二的補充,應聘者應該知道的是,一旦你提到了hashCode()方法,人們很可能要問HashMap是如何使用這個函數的。當你向HashMap插入一個key的時候,首先,這個對象的hashCode()方法會被調用,調用結果用來計算將要存儲的位置(bucket)。


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


  在Java中如何避免死鎖?


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


  創建字符串對象的時候,使用字面值和使用new String()構造器這兩種方式有什么不同?


  當我們使用new String構造器來創建字符串的時候,字符串的值會在堆中創建,而不會加入JVM的字符串池中。相反,使用字面值創建的String對象會被放入堆的PermGen段中。例如:


  String str=new String(“Test”);


  這句代碼創建的對象str不會放入字符串池中,我們需要顯式調用String.intern()方法來將它放入字符串池中。僅僅當你使用字面值創建字符串時,Java才會自動將它放入字符串池中,比如:String s=”Test”。順便提一下,這里有個容易被忽視的地方,當我們將參數“Test”傳入構造器的時候,這個參數是個字面值,因此它也會在字符串池中保存另外一份。想了解更多關于字面值字符串和字符串對象之間的差別,請看這篇文章。


  下圖很好地解釋了這種差異。


來自交通銀行Java面試題目總結


  什么是不可修改對象(Immutable Object)?你能否寫一個例子?


  不可修改對象是那些一旦被創建就不能修改的對象。對這種對象的任何改動的后果都是會創建一個新的對象,而不是在原對象本身做修改。例如Java中的String類就是不可修改的。大多數這樣的類通常都是final類型的,因為這樣可以避免自己被繼承繼而被覆蓋方法,在覆蓋的方法里,不可修改的特性就難以得到保證了。你通常也可以通過將類的成員設置成private但是非final的來獲得同樣的效果。


  另外,你同樣要保證你的類不要通過任何方法暴露成員,特別是那些可修改類型的成員。同樣地,當你的方法接收客戶類傳入的可修改對象的話,你應該使用一個復制的對象來防止客戶代碼來修改這個剛傳入的可修改類。比如,傳入java.util.Date對象的話,你應該自己使用clone()方法來獲得一個副本。


  當你通過類函數返回一個可修改對象的時候,你也要采取類似的防護措施,返回一個類成功的副本,防止客戶代碼通過此引用修改了成員對象的屬性。千萬不要直接把你的可修改成員直接返回給客戶代碼。

  

來自交通銀行Java面試題目總結


      以上就是動力節點Java培訓機構小編介紹的“來自交通銀行Java面試題目總結”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。


相關推薦


最新最全java面試題及答案(初級到高級)


史上最全的中高級JAVA工程師面試題及答案匯總


Java高級開發工程師面試題


2019史上最全java面試題題庫大全800題


哪有資深java工程師面試題


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 日日日日人人人夜夜夜2017 | 亚洲欧美日韩高清一区二区三区 | 亚洲精品图区 | 亚洲精品国产第一区二区三区 | 亚欧洲精品bb | 亚洲精品一区二区三区美女 | 国产精品久久久久影院 | 日韩一区二区三区视频在线观看 | 欧美高清国产 | 97精品视频共享总站 | 欧美成人欧美激情欧美风情 | 国产精品一区久久 | 四虎影院紧急入口 | 欧美一区二区三区久久久人妖 | 一区二区在线精品免费视频 | 亚洲免费视频在线观看 | 激情一区二区三区成人 | 玖玖在线资源 | 久久国内精品自在自线观看 | 久草视频免费在线播放 | 色综久久天天综合绕视看 | 亚洲精品动漫一区二区三区在线 | 每日更新在线观看av | 亚洲无成人网77777 | 伊人色综合久久 | 国产精品成人第一区 | 天天干天天射天天爽 | 色狠狠成人综合色 | 国产午夜亚洲精品久久999 | 92自拍视频 | a毛片a毛片a视频 | 国产精品国产高清国产专区 | 国产伦精品一区二区三区 | 久久综合一区二区三区 | 亚洲一区二区三区中文字幕 | 开心激情四房 | 国产在视频线精品www666 | 日韩在线视频一区二区三区 | 在线国产视频一区 | 天天久久狠狠色综合 | 欧美一级毛片俄罗斯 |