更新時(shí)間:2020-01-10 15:59:43 來源:動(dòng)力節(jié)點(diǎn) 瀏覽3083次

HashMap的get和put原理
PUT原理:當(dāng)調(diào)用HashMap的put方法傳遞key和value時(shí),先調(diào)用key的hashcode方法。通過key的Hash值來找到Bucket----‘桶’的位置,然后迭代這個(gè)位置的Entry列表 判斷是否存在key的hashcode和equals完全相同的key,如果完全相同則覆蓋value, 否則插入到entry鏈的頭部。
HashMap在put時(shí)的Entry鏈形成的場(chǎng)景?
當(dāng)程序試圖將一個(gè)key-value對(duì)放入HashMap中時(shí),程序首先根據(jù)該 key 的 hashCode() 返回值決定該 Entry 的存儲(chǔ)位置:如果這兩個(gè) Entry 的 key 的 hashCode() 返回值相同,那它們的存儲(chǔ)位置相同。如果這兩個(gè) Entry 的 key 通過 equals 比較返回 true,新添加 Entry 的 value 將覆蓋集合中原有 Entry 的 value,但key不會(huì)覆蓋。
如果這兩個(gè) Entry 的 key 通過 equals 比較返回 false,新添加的 Entry 將與集合中原有 Entry 形成 Entry 鏈,而且新添加的 Entry 位于 Entry 鏈的頭部
GET原理:根據(jù)該 key 的 hashCode 值計(jì)算它的 hash 碼,遍歷并循環(huán)取出 Entry 數(shù)組中指定索引處的Entry值,如果該 Entry 的 key 與被搜索 key 相同 ,且Enrty的hash值跟key的hash碼相同,然后看是否是Entry鏈,如果是則迭代這個(gè)位置的Entry列表,判斷是否存在key的hashcode和equals完全相同的key,如果完全相同則獲取value。
HashMap的rehash
HashMap初始容量大小為16,一般來說,當(dāng)有數(shù)據(jù)要插入時(shí),都會(huì)檢查容量有沒有超過設(shè)定的thredhold,如果超過,需要增大Hash表的尺寸,但是這樣一來,整個(gè)Hash表里的元素都需要被重算一遍。這叫rehash,這個(gè)成本相當(dāng)?shù)拇?/p>
HashMap的線程不安全問題
比如put操作時(shí),有兩個(gè)線程A和B,首先A希望插入一個(gè)key-value對(duì)到HashMap中,首先計(jì)算記錄所要落到的桶的索引BucketIndex坐標(biāo),然后獲取到該桶里面的Entry鏈表header頭結(jié)點(diǎn),此時(shí)線程A的時(shí)間片用完了,而此時(shí)線程B被調(diào)度得以執(zhí)行,和線程A一樣執(zhí)行,只不過線程B成功將記錄插到了桶里面,假設(shè)線程A插入的記錄計(jì)算出來的桶索引和線程B要插入的記錄計(jì)算出來的桶索引是一樣的,那么當(dāng)線程B成功插入之后,線程A再次被調(diào)度運(yùn)行時(shí),它依然持有過期的鏈表頭但是它對(duì)此一無所知,以至于它認(rèn)為它應(yīng)該這樣做,如此一來就覆蓋了線程B插入的記錄,這樣線程B插入的記錄就憑空消失了,造成了數(shù)據(jù)不一致的行為。另一個(gè)不安全的體現(xiàn)是是get操作可能由于resize而死循環(huán)。
HashMap和Hashtable的區(qū)別
相同點(diǎn):1 都實(shí)現(xiàn)了Map接口 2 Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會(huì)有很大的差異
不同點(diǎn):1 hashMap允許NULL作為key和value,而hashtable不允許 2 hashMap線程不安全,Hashtable線程安全 3 hashMap速度快于hashtable 4 HashMap 把 Hashtable的contains方法去掉了,改成containsvalue和containsKey,避免引起誤會(huì) 5 Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進(jìn)的Map接口的一個(gè)實(shí)現(xiàn)
為什么collection沒有實(shí)現(xiàn)clonable接口
Collection接口有很多不同的集合實(shí)現(xiàn)形式,而clonable只對(duì)具體的對(duì)象有意義。
為什map沒有實(shí)現(xiàn)collection接口
Set 和List 都繼承了Conllection,Map沒有繼承于Collection接口,Map提供的是key-Value的映射,而Collection代表一組對(duì)象。
Map接口的實(shí)現(xiàn)有哪些,區(qū)別是什么
HashMap,LinkedHashMap,Hashtable,TreeMap。
LinkedHashMap 是HashMap的一個(gè)子類,保存了記錄的插入順序 Hashtable和HashMap類似,它繼承自Dictionary類,不同的是它不允許鍵或值為空。TreeMap實(shí)現(xiàn)SortMap接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器
方法區(qū)卸載Class的條件
1 該類所有的實(shí)例已經(jīng)被回收 2 加載該類的ClassLoader已經(jīng)被回收 4該類對(duì)應(yīng)的java.lang.Class對(duì)象沒有任何地方被引用
Ps:方法區(qū)除了回收無用class,也回收廢棄常量,即沒有被引用常量
可以作為GC Roots的對(duì)象包括哪些
虛擬機(jī)棧(棧幀中的局部變量表)中引用的變量 ?方法區(qū)中類靜態(tài)屬性引用的對(duì)象 ?方法區(qū)中常量引用的對(duì)象 ?本地方法棧中JNI引用的變量
JVM運(yùn)行時(shí)內(nèi)存模型
方法區(qū)、堆、虛擬機(jī)棧、本地方法棧、程序計(jì)數(shù)器
Netty的ByteBuffer的引用計(jì)數(shù)器機(jī)制
從netty的4.x版本開始,netty使用引用計(jì)數(shù)機(jī)制進(jìn)行部分對(duì)象的管理,通過該機(jī)制netty可以很好的實(shí)現(xiàn)自己的共享資源池。如果應(yīng)用需要一個(gè)資源,可以從netty自己的共享資源池中獲取,新獲取的資源對(duì)象的引用計(jì)數(shù)被初始化為1,可以通過資源對(duì)象的retain方法增加引用計(jì)數(shù),當(dāng)引用計(jì)數(shù)為0的時(shí)候該資源對(duì)象擁有的資源將會(huì)被回收。
判斷對(duì)象是否存活的兩種方法
1 引用計(jì)數(shù)法:缺點(diǎn)是對(duì)循環(huán)引用的對(duì)象無法回收 2 可達(dá)性分析

以上就是動(dòng)力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“高級(jí)Java工程師面試題”的內(nèi)容,希望對(duì)大家有幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)推薦
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)