HashMap,ConcurrentHashMap相关知识整理
1.HashMap的存储步骤:
1.传入key和value,判断key是否为null,如果为null,则调用putForNullKey,以null作为key存储到哈希表中;
2. 然后计算key的hash值,根据hash值搜索在哈希表table中的索引位置,若当前索引位置不为null,则对该位置的Entry链表进行遍历,如果链中存在该key,则用传入的value覆盖掉旧的value,同时把旧的value返回,结束;
3. 否则调用addEntry,用key-value创建一个新的节点,并把该节点插入到该索引对应的链表的头部
参考网址:http://blog.csdn.net/jeffleo/article/details/54946424
2.HashMap与HashTable的比较
1.继承的父类不同
2.线程安全性不同
3.是否提供contains方法
4.key和value是否允许为null
5.两个遍历的内部实现方式不同
6.hash值不同
参考网址为:http://blog.csdn.net/fujiakai/article/details/51585767
3.concurrentHashMap
并发编程中,concurrentHashMap是一个经常被使用的数据结构,相比于Hashtable以及Collections.synchronizedMap(),ConcurrentHashMap在线程安全的基础上
提供了更好的写并发能力,但同时降低了对读一致性的要求。
HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中
一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是concurrenthashmap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段啊的数据也能被其他线程访问。
参考网址:http://ifeve.com/concurrenthashmap/