真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java常見集合類面試題有哪些

這篇文章主要講解了“Java常見集合類面試題有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java常見集合類面試題有哪些”吧!

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、雅安服務(wù)器托管、營(yíng)銷軟件、網(wǎng)站建設(shè)、云安網(wǎng)站維護(hù)、網(wǎng)站推廣。

21.HashMap的工作原理是什么?

HashMap內(nèi)部是通過(guò)一個(gè)數(shù)組實(shí)現(xiàn)的,只是這個(gè)數(shù)組比較特殊,數(shù)組里存儲(chǔ)的元素是一個(gè)Entry實(shí)體(jdk 8為Node),這個(gè)Entry實(shí)體主要包含key、value以及一個(gè)指向自身的next指針。HashMap是基于hashing實(shí)現(xiàn)的,當(dāng)我們進(jìn)行put操作時(shí),根據(jù)傳遞的key值得到它的hashcode,然后再用這個(gè)hashcode與數(shù)組的長(zhǎng)度進(jìn)行模運(yùn)算,得到一個(gè)int值,就是Entry要存儲(chǔ)在數(shù)組的位置(下標(biāo));當(dāng)通過(guò)get方法獲取指定key的值時(shí),會(huì)根據(jù)這個(gè)key算出它的hash值(數(shù)組下標(biāo)),根據(jù)這個(gè)hash值獲取數(shù)組下標(biāo)對(duì)應(yīng)的Entry,然后判斷Entry里的key,hash值或者通過(guò)equals()比較是否與要查找的相同,如果相同,返回value,否則的話,遍歷該鏈表(有可能就只有一個(gè)Entry,此時(shí)直接返回null),直到找到為止,否則返回null。
HashMap之所以在每個(gè)數(shù)組元素存儲(chǔ)的是一個(gè)鏈表,是為了解決hash沖突問(wèn)題,當(dāng)兩個(gè)對(duì)象的hash值相等時(shí),那么一個(gè)位置肯定是放不下兩個(gè)值的,于是hashmap采用鏈表來(lái)解決這種沖突,hash值相等的兩個(gè)元素會(huì)形成一個(gè)鏈表。

22.HashMap與HashTable的區(qū)別是什么?

1.HashTable基于Dictionary類,而HashMap是基于AbstractMap。Dictionary是任何可將鍵映射到相應(yīng)值的類的抽象父類,而AbstractMap是基于Map接口的實(shí)現(xiàn),它以最大限度地減少實(shí)現(xiàn)此接口所需的工作。(在java 8中我查看源碼發(fā)現(xiàn)Hashtable并沒(méi)有繼承Dictionary,而且里面也沒(méi)有同步方法,是不是java 8中Hashtable不在同步的了?有沒(méi)有人解釋一下?)
2. HashMap的key和value都允許為null,而Hashtable的key和value都不允許為null。HashMap遇到key為null的時(shí)候,調(diào)用putForNullKey方法進(jìn)行處理,而對(duì)value沒(méi)有處理;Hashtable遇到null,直接返回NullPointerException。
3. Hashtable是同步的,而HashMap是非同步的,但是我們也可以通過(guò)Collections.synchronizedMap(hashMap),使其實(shí)現(xiàn)同步。

23.CorrentHashMap的工作原理?

jdk 1.6版: ConcurrenHashMap可以說(shuō)是HashMap的升級(jí)版,ConcurrentHashMap是線程安全的,但是與Hashtablea相比,實(shí)現(xiàn)線程安全的方式不同。Hashtable是通過(guò)對(duì)hash表結(jié)構(gòu)進(jìn)行鎖定,是阻塞式的,當(dāng)一個(gè)線程占有這個(gè)鎖時(shí),其他線程必須阻塞等待其釋放鎖。ConcurrentHashMap是采用分離鎖的方式,它并沒(méi)有對(duì)整個(gè)hash表進(jìn)行鎖定,而是局部鎖定,也就是說(shuō)當(dāng)一個(gè)線程占有這個(gè)局部鎖時(shí),不影響其他線程對(duì)hash表其他地方的訪問(wèn)。
具體實(shí)現(xiàn): ConcurrentHashMap內(nèi)部有一個(gè)Segment數(shù)組, 該Segment對(duì)象可以充當(dāng)鎖。Segment對(duì)象內(nèi)部有一個(gè)HashEntry數(shù)組,于是每個(gè)Segment可以守護(hù)若干個(gè)桶(HashEntry),每個(gè)桶又有可能是一個(gè)HashEntry連接起來(lái)的鏈表,存儲(chǔ)發(fā)生碰撞的元素。
每個(gè)ConcurrentHashMap在默認(rèn)并發(fā)級(jí)下會(huì)創(chuàng)建包含16個(gè)Segment對(duì)象的數(shù)組,每個(gè)數(shù)組有若干個(gè)桶,當(dāng)我們進(jìn)行put方法時(shí),通過(guò)hash方法對(duì)key進(jìn)行計(jì)算,得到hash值,找到對(duì)應(yīng)的segment,然后對(duì)該segment進(jìn)行加鎖,然后調(diào)用segment的put方法進(jìn)行存儲(chǔ)操作,此時(shí)其他線程就不能訪問(wèn)當(dāng)前的segment,但可以訪問(wèn)其他的segment對(duì)象,不會(huì)發(fā)生阻塞等待。
jdk 1.8版 在jdk 8中,ConcurrentHashMap不再使用Segment分離鎖,而是采用一種樂(lè)觀鎖CAS算法來(lái)實(shí)現(xiàn)同步問(wèn)題,但其底層還是“數(shù)組+鏈表->紅黑樹”的實(shí)現(xiàn)。

24.遍歷一個(gè)List有哪些不同的方式?

    List strList = new ArrayList<>();
    //for-each
    for(String str:strList) {
        System.out.print(str);
    }

    //use iterator 盡量使用這種 更安全(fail-fast)
    Iterator it = strList.iterator();
    while(it.hasNext) {
        System.out.printf(it.next());
    }

25.fail-fast與fail-safe有什么區(qū)別?

Iterator的fail-fast屬性與當(dāng)前的集合共同起作用,因此它不會(huì)受到集合中任何改動(dòng)的影響。Java.util包中的所有集合類都被設(shè)計(jì)為fail->fast的,而java.util.concurrent中的集合類都為fail-safe的。當(dāng)檢測(cè)到正在遍歷的集合的結(jié)構(gòu)被改變時(shí),F(xiàn)ail-fast迭代器拋出ConcurrentModificationException,而fail-safe迭代器從不拋出ConcurrentModificationException。

26.Array和ArrayList有何區(qū)別?什么時(shí)候更適合用Array?

  1. Array可以容納基本類型和對(duì)象,而ArrayList只能容納對(duì)象。

  2. Array是指定大小的,而ArrayList大小是固定的

27.哪些集合類提供對(duì)元素的隨機(jī)訪問(wèn)?

ArrayList、HashMap、TreeMap和HashTable類提供對(duì)元素的隨機(jī)訪問(wèn)。

28.HashSet的底層實(shí)現(xiàn)是什么?

通過(guò)看源碼知道HashSet的實(shí)現(xiàn)是依賴于HashMap的,HashSet的值都是存儲(chǔ)在HashMap中的。在HashSet的構(gòu)造法中會(huì)初始化一個(gè)HashMap對(duì)象,HashSet不允許值重復(fù),因此,HashSet的值是作為HashMap的key存儲(chǔ)在HashMap中的,當(dāng)存儲(chǔ)的值已經(jīng)存在時(shí)返回false。

29.LinkedHashMap的實(shí)現(xiàn)原理?

LinkedHashMap也是基于HashMap實(shí)現(xiàn)的,不同的是它定義了一個(gè)Entry header,這個(gè)header不是放在Table里,它是額外獨(dú)立出來(lái)的。LinkedHashMap通過(guò)繼承hashMap中的Entry,并添加兩個(gè)屬性Entry before,after,和header結(jié)合起來(lái)組成一個(gè)雙向鏈表,來(lái)實(shí)現(xiàn)按插入順序或訪問(wèn)順序排序。LinkedHashMap定義了排序模式accessOrder,該屬性為boolean型變量,對(duì)于訪問(wèn)順序,為true;對(duì)于插入順序,則為false。一般情況下,不必指定排序模式,其迭代順序即為默認(rèn)為插入順序。

30.LinkedList和ArrayList的區(qū)別是什么?

  1. ArrayList是基于數(shù)組實(shí)現(xiàn),LinkedList是基于鏈表實(shí)現(xiàn)

  2. ArrayList在查找時(shí)速度快,LinkedList在插入與刪除時(shí)更具優(yōu)勢(shì)

感謝各位的閱讀,以上就是“Java常見集合類面試題有哪些”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java常見集合類面試題有哪些這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


當(dāng)前題目:Java常見集合類面試題有哪些
網(wǎng)站網(wǎng)址:http://weahome.cn/article/iehiod.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部