HashMap,HashTable,ConcurrentHashMap

hash算法:是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。

 

1. 

HashMap

public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable

官方文档描述:Hash table based implementation of the Map interface. This implementation provides all of the optional map operations, and permits null values and the null key. (The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.) This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.

key points::基于Map接口实现、允许null键/值、非同步、不保证有序(比如插入的顺序)、也不保证序不随时间变化。

 

内部实现:最基本的数据结构就是数组和链表,hashMap就是这两者的结合体,HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

详细信息参照 http://www.cnblogs.com/hzmark/archive/2012/12/24/HashMap.html

 

table数组储存的是key hashcode不同的一个链组,同一条链是存储着相同hashcode的,但equas不同的key对象,如果有新的key加入时,直接计算出key在table数组中的位置,然后在这个位置的链表中寻找是否有相同的key,有则替换value,否则插入节点 

 

HashMap和HashTable的区别

hashTable:注意1 方法是同步的
注意2 方法不允许value==null
注意3 方法调用了key的hashCode方法,如果key==null,会抛出空指针异常 HashMap的put方法如下

 

HashMap:注意1 方法是非同步的
注意2 方法允许key==null
注意3 方法并没有对value进行任何调用,所以允许为null

 

2. HashTable

3. concurrentHashMap

HashTable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

 

ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLock,在ConcurrentHashMap里扮演锁的角色,HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构, 一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素, 每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁。

 

 

posted @ 2017-02-14 15:07  zjxbeta  阅读(105)  评论(0编辑  收藏  举报