list set map 各自实现类的区别以及它们的底层原理和实现(部分)
List
List是一個不唯一有序的集合。
實現(xiàn)類:
ArrayList:
底層結果是數(shù)組,所以查詢快,增刪慢,線程不安全。
Vector:
底層結果是數(shù)組,查詢快,增刪慢,線程安全。
Linkedlist
底層結果是雙向鏈表,查詢慢,增刪快,線程不安全。
Set
Set是一個唯一無序的集合。
實現(xiàn)類:
HashSet:
hashset其實是hashmap的一個實例,都是一個存放鏈表的數(shù)組,允許有null元素,hashset中的元素都存放在hashmap中的key上面,value是一個固定對象,hashset中的add()方法其實調(diào)用的是底層的hashmap中的put()方法,而如果是在HashMap中調(diào)用put,首先會判斷key是否存在,如果key存在則修改value值,如果key不存在就插入這個key-value。而在set中,因為value值沒有用,也就不存在修改value值的說法,因此往HashSet中添加元素,首先判斷元素(也就是key)是否存在,如果不存在這插入,如果存在就不插入,這樣HashSet中就不存在重復值。總結:無序,唯一,線程不安全,允許null值。
TreeSet:
是一個有序集合,是基于treemap實現(xiàn)的支持兩種排序方式,自然排序和定制排序,treeset是非同步的,線程不安全。
LinkedHashSet:
有序,在迭代訪問set中的元素時,性能比hashset好,但是插入時性能比hashset差。
Map
map是以鍵值對方式存儲數(shù)據(jù)的。
實現(xiàn)類:
HashMap:
底層結構是哈希表,不過在jdk1.8以前,哈希表是由數(shù)組+鏈表合體實現(xiàn)的,在jdk1.8中,哈希表是由數(shù)組+鏈表+紅黑樹合體實現(xiàn)的,當鏈表長度超過閾值(8)時,會自動轉為紅黑樹,這樣就大大的提高了效率,減少了查詢時間。總結:線程不安全,不允許鍵值重復,允許null值和null鍵。
**存儲元素時的流程和原理:**當程序試圖將一個key-value對放入HashMap中時,程序首先根據(jù)該 key的 hashCode() 返回值決定該 Entry 的存儲位置:如果兩個 Entry 的 key 的 hashCode() 返回值相同,那它們的存儲位置相同。如果這兩個 Entry 的 key 通過 equals 比較返回 true,新添加 Entry 的 value 將覆蓋集合中原有 Entry的 value,但key不會覆蓋。如果這兩個 Entry 的 key 通過 equals 比較返回 false,新添加的 Entry 將與集合中原有 Entry 形成 Entry 鏈,而且新添加的 Entry 位于 Entry 鏈的頭部。也就是數(shù)組+鏈表的存儲元素流程。
HashTable:
底層結果與hashmap相同,唯一不同的就是線程安全,鍵和值都不允許為null,提供了對鍵的列舉,
TreeMap:
是一個有序集合,底層是紅黑樹,每個key-value都作為一個紅黑樹的節(jié)點。如果在調(diào)用TreeMap的構造函數(shù)時沒有指定比較器,則根據(jù)key執(zhí)行自然排序。這點會在接下來的代碼中做說明,如果指定了比較器則按照比較器來進行排序。
總結
以上是生活随笔為你收集整理的list set map 各自实现类的区别以及它们的底层原理和实现(部分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Bean的生命周期(详细)
- 下一篇: 映射Mapper.xml文件的几种方式