谈到HashMap和ConcurrentHashMap,必然会联想到一些其他集合结构,比如HashTable,Vector等,先理一下他们的区别吧。其实HashTable和Vector已经被废弃了,HashTable和Vector以及ConcurrentHashMap都是线程安全的同步结构,区别是HashTable和Vector是采用synchronized关键字对整个集合对象加锁,效率低下。而ConcurrentHashMap则是采用分段加锁的方式细化了锁的颗粒度,由于高效率所以替代了前两者。但是HashMap是线程不安全的,至于为什么线程不安全下文会有详解,先比较一下两个版本中HashMap和ConcurrentHashMap有什么改变。
一.HashMap
1.JDK1.7中
HashMap本质上是一个Entry数组,Entry中即为键值对,Entry数组在table中的位置是这么计算出来的:
int hash = hash(key.hashCode());
int index = indexFor(hash,table.length);
大致是根据key对象的hashcode值,即key对象的内存地址值,通过hash算法得到一个hash值,这里很清晰的可以看出hashcode值和hash值是两个东西两个概念不要混淆。得到hash值后,再结合数组table的长度计算出数组下标,这里贴出两个算法内容,即hash算法hash()以及位置算法indexFor()。
static final hash(Object key){
int h;
return (key == nul