您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java常見集合類面試題有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java常見集合類面試題有哪些”吧!
HashMap內部是通過一個數組實現的,只是這個數組比較特殊,數組里存儲的元素是一個Entry實體(jdk 8為Node),這個Entry實體主要包含key、value以及一個指向自身的next指針。HashMap是基于hashing實現的,當我們進行put操作時,根據傳遞的key值得到它的hashcode,然后再用這個hashcode與數組的長度進行模運算,得到一個int值,就是Entry要存儲在數組的位置(下標);當通過get方法獲取指定key的值時,會根據這個key算出它的hash值(數組下標),根據這個hash值獲取數組下標對應的Entry,然后判斷Entry里的key,hash值或者通過equals()比較是否與要查找的相同,如果相同,返回value,否則的話,遍歷該鏈表(有可能就只有一個Entry,此時直接返回null),直到找到為止,否則返回null。
HashMap之所以在每個數組元素存儲的是一個鏈表,是為了解決hash沖突問題,當兩個對象的hash值相等時,那么一個位置肯定是放不下兩個值的,于是hashmap采用鏈表來解決這種沖突,hash值相等的兩個元素會形成一個鏈表。
1.HashTable基于Dictionary類,而HashMap是基于AbstractMap。Dictionary是任何可將鍵映射到相應值的類的抽象父類,而AbstractMap是基于Map接口的實現,它以最大限度地減少實現此接口所需的工作。(在java 8中我查看源碼發現Hashtable并沒有繼承Dictionary,而且里面也沒有同步方法,是不是java 8中Hashtable不在同步的了?有沒有人解釋一下?)
2. HashMap的key和value都允許為null,而Hashtable的key和value都不允許為null。HashMap遇到key為null的時候,調用putForNullKey方法進行處理,而對value沒有處理;Hashtable遇到null,直接返回NullPointerException。
3. Hashtable是同步的,而HashMap是非同步的,但是我們也可以通過Collections.synchronizedMap(hashMap),使其實現同步。
jdk 1.6版: ConcurrenHashMap可以說是HashMap的升級版,ConcurrentHashMap是線程安全的,但是與Hashtablea相比,實現線程安全的方式不同。Hashtable是通過對hash表結構進行鎖定,是阻塞式的,當一個線程占有這個鎖時,其他線程必須阻塞等待其釋放鎖。ConcurrentHashMap是采用分離鎖的方式,它并沒有對整個hash表進行鎖定,而是局部鎖定,也就是說當一個線程占有這個局部鎖時,不影響其他線程對hash表其他地方的訪問。
具體實現: ConcurrentHashMap內部有一個Segment數組, 該Segment對象可以充當鎖。Segment對象內部有一個HashEntry數組,于是每個Segment可以守護若干個桶(HashEntry),每個桶又有可能是一個HashEntry連接起來的鏈表,存儲發生碰撞的元素。
每個ConcurrentHashMap在默認并發級下會創建包含16個Segment對象的數組,每個數組有若干個桶,當我們進行put方法時,通過hash方法對key進行計算,得到hash值,找到對應的segment,然后對該segment進行加鎖,然后調用segment的put方法進行存儲操作,此時其他線程就不能訪問當前的segment,但可以訪問其他的segment對象,不會發生阻塞等待。
jdk 1.8版 在jdk 8中,ConcurrentHashMap不再使用Segment分離鎖,而是采用一種樂觀鎖CAS算法來實現同步問題,但其底層還是“數組+鏈表->紅黑樹”的實現。
List<String> strList = new ArrayList<>(); //for-each for(String str:strList) { System.out.print(str); } //use iterator 盡量使用這種 更安全(fail-fast) Iterator<String> it = strList.iterator(); while(it.hasNext) { System.out.printf(it.next()); }
Iterator的fail-fast屬性與當前的集合共同起作用,因此它不會受到集合中任何改動的影響。Java.util包中的所有集合類都被設計為fail->fast的,而java.util.concurrent中的集合類都為fail-safe的。當檢測到正在遍歷的集合的結構被改變時,Fail-fast迭代器拋出ConcurrentModificationException,而fail-safe迭代器從不拋出ConcurrentModificationException。
Array可以容納基本類型和對象,而ArrayList只能容納對象。
Array是指定大小的,而ArrayList大小是固定的
ArrayList、HashMap、TreeMap和HashTable類提供對元素的隨機訪問。
通過看源碼知道HashSet的實現是依賴于HashMap的,HashSet的值都是存儲在HashMap中的。在HashSet的構造法中會初始化一個HashMap對象,HashSet不允許值重復,因此,HashSet的值是作為HashMap的key存儲在HashMap中的,當存儲的值已經存在時返回false。
LinkedHashMap也是基于HashMap實現的,不同的是它定義了一個Entry header,這個header不是放在Table里,它是額外獨立出來的。LinkedHashMap通過繼承hashMap中的Entry,并添加兩個屬性Entry before,after,和header結合起來組成一個雙向鏈表,來實現按插入順序或訪問順序排序。LinkedHashMap定義了排序模式accessOrder,該屬性為boolean型變量,對于訪問順序,為true;對于插入順序,則為false。一般情況下,不必指定排序模式,其迭代順序即為默認為插入順序。
ArrayList是基于數組實現,LinkedList是基于鏈表實現
ArrayList在查找時速度快,LinkedList在插入與刪除時更具優勢
感謝各位的閱讀,以上就是“Java常見集合類面試題有哪些”的內容了,經過本文的學習后,相信大家對Java常見集合類面試題有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。