关于java:集合二Map双列集合

29次阅读

共计 2129 个字符,预计需要花费 6 分钟才能阅读完成。

Map 汇合体系


Map

Map 是一种双列汇合

它的每个元素都蕴含一个键对象 key 和一个值对象 value

键和值之间存在一种对应关系,称为映射

从 Map 汇合中拜访元素,只有指定了 key,就能找到对应的 value。

1、HashMap(数组 + 链表 / 红黑树)
HashMap 实现原理

HashMap 是基于 Hash 算法实现的,通过 put(kty,value)存储,get(kty,value)获取。

当传入 key 是,HashMap 会依据 key.hashCode()计算出 hash 值,依据 hash 值将 value 保留在 bucket 中。

当计算出的 hash 值雷同时,称为哈希抵触。

HashMap 的做法是用链表和红黑树 (jdk1.8) 存储雷同的 hash 值的 value。

当 hash 抵触个数较少,应用链表,否则应用红黑树。

特点:

HashMap 去掉了 contains(),改成 containsKey()和 containsValue()

非线程平安,容许键值为 null,存取程序不统一。

HaspMap 容许键值为空

默认大小 16,负载因子大小为 0.75

取出 Map 中的键值该如何遍历

形式一: 获取键的汇合、遍历键的汇合、获取每个键对应的值

形式二: 获取汇合中映射关系、获取映射关系中的键、获取映射中的值

2、LinkedHashMap(数组 + 红黑数 + 双向链表)

继承自 HashMap 是 HashMap 的一个子类,容许 key 和 value 都为空,保留了记录的插入程序,在用 Iterator 遍历 LinkedHashMap 时,先失去的记录必定是先插入的,也能够在结构时带参数,依照 拜访秩序 (有序) 排序。

3、ConcurrentHashMap(分段数组 + 链表 / 红黑树)

Java5 提供了 ConcurrentHashMap,它是 HashTable 的代替

1.7 与 1.8 区别

jdk1.7 中采纳 ReentrantLock+segment+HashEntry 的形式,lock 加在 Segment 上。Size 计算采纳不加锁的形式,间断计算元素的个数,最多计算 3 次,如果前后两次计算结果雷同,阐明元素个数精确,如果前后两次不同,则给 segment 加锁,在计算一次。通过 segment 分段锁保障线程平安​。

jdk1.8 舍弃了 segment,取代的是 CAS+synchronized+HashEntry+ 红黑树的形式,应用 volatile 类型的变量 baseCount 记录元素的个数,当插入新数据或删除数据时,通过 addCount()办法更新 baseCount,通过累加 baseCount 和 CounterCell 数组中的数量失去元素总数。通过 CAS+synchronized 保障线程平安​。​

实现原理

ConcurrentHashMap 类中蕴含两个动态外部类 HashEntry 和 segment。HashEntry 用来封装映射表的键值对。Segment 用来充当锁的角色,每个 Segment 对象守护整个散列表的若干个桶。每个桶由若干个 HashEntry 对象连接起来的链表。

Segment 段

ConcurrentHashMap 和 HashMap 思路是差不多的,然而因为它反对并发操作,所以要简单一 些。整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表”局部“或”一段“的 意思,所以很多中央都会将其形容为分段锁。留神,行文中,我很多中央用了“槽”来代表一个 segment。

线程平安(segment 继承 ReentrantLocak 加锁)

简略了解就是,ConcurrentHashMap 是一个 Segment 数组,Segment 通过继承 ReentrantLock 来进行加锁,所以每次须要加锁的操作锁住的是一个 segment,这样只有保障每 个 Segment 是线程平安的,也就实现了全局的线程平安。

4、HashTable

Hashtable 是遗留类,很多映射的罕用性能与 HashMap 相似,不同的是它承自 Dictionary 类,并且是线程平安的。

任一时间只有一个线程能写 Hashtable,并发性不如 ConcurrentHashMap,因为 ConcurrentHashMap 引入了分段锁。

Hashtable 不倡议在新代码中应用,不须要线程平安的场合能够用 HashMap 替换,须要线程平安的场合能够用 ConcurrentHashMap 替换。

5、Properties

是 Hashtable 的子类

读写资源配置文件

键与值都只能字符串

p.setProperties(“key”,”value”)  
p.getProperties(“key”,”value”) 

6、TreeMap

TreeMap 实现 SortedMap 接口,可能把它保留的记录依据键排序,默认是按键值的升序排序,也能够指定排序的比拟器,当用 Iterator 遍历 TreeMap 时,失去的记录是排过序的。

如果应用排序的映射,倡议应用 TreeMap。

在应用 TreeMap 时,key 必须实现 Comparable 接口或者在结构 TreeMap 传入自定义的 Comparator,否则会在运行时抛出 java.lang.ClassCastException 类型的异样。

不容许键值为空

                    如果文章对你有帮忙

                    记得点赞 + 分享 + 转发

正文完
 0