Geek

博客园 首页 新随笔 联系 订阅 管理

集合专题

HashSet

HashSet不是按照存储元素的顺序写入的,而是通过按照哈希值来存的,所有取数据也是按照哈希值取得,HashSet首先
判断两个元素的哈希值,如果哈希值相同,会接着比较 equals方法。 hashset通过 hashCode的值来确定元素在内存中的位置,
一个hashcode位置有多个元素。

TreeSet

自定义的对象必须要实现 Comparable的接口,重写 compareTo的函数 才能使用。也可以策略模式,自己定义一个比较器

LinkedHashSet(HashSet + LinkedHashMap实现)

底层使用的是 LinkedHashMap保存对象,但是又继承了 HashSet的方法,直接调用的 HashSet的方法。

HashMap(数组,链表,红黑树)

HashMap 根据键值的Hashcode存储数据,一般情况下可以直接定位它的值。 HasHMap里面是一个数组,数组的每个元素都是一条单向链表

capacity: 数组的容量,始终保持为 2N, 扩容后数组大小是当前两倍
loadFactor,负载因子,默认为 0.75
threshold: 扩容的阈值,达到这个阈值了,就会扩容 ,等于 capacity*loadFactor
java 8对 Hashmap做了改进,当 数组容量大于 64,且链表中的元素超过8个以后,这个链表会转为红黑树。
选择8是因为符号泊松分布,超过8的时候,概率已经非常小了.所以选择8

ConcurrentHashMap

ConcurrentHashMap在8以前使用的是一个 Segment数组继承了 ReentrantLock加锁,每次加锁锁住一个 Segment,每个segment是线程安全的,因此也就整一个 HashMap都是线程安全的了。

concurrentcyLevel: segment的数量,也就是并行级别,segment数量决定了一个 ConcurrentHashMap 的最大线程并发数量是多少。 ConcurrentHashMap 默认 16个segments,理论上只能同时支持最多16个线程的并发。

java8则是 使用了 CAS的方法来优化。而且 ConcurrentHashMap也是使用了红黑树。

TreeMap

实现了 SortedMap接口,可以根据键值来排序,
TreeMap

LinkedHashMap

遍历时候 会按照插入的顺序进行遍历

posted on 2020-07-14 11:29  .geek  阅读(184)  评论(0编辑  收藏  举报