一.HashMap VS Hashtable
1.HashMap 是非线程安全的,Hashtable 是线程安全的;
2.HashMap 是能接受null 键值对的 默认null键 哈希值是0,Hashtable不能接受空键值对;
3.HashMap 的迭代器是(fail-fast)迭代器, Hashtable是fail-safe迭代器;
4.HashMap 在java5提共了ConcurrentHashMap,是安全的HashMap 也是 Hashtable的替代品,具有更好的扩展性, java5以下首选Hashtable;
备注:
HashMap可以通过下面的语句进行同步:Map m = Collections.synchronizeMap(hashMap);
fail-fast:直接在容器上进行遍历,在遍历过程中,一旦发现容器中的数据被修改了,会立刻抛出ConcurrentModificationException异常导致遍历失败。
fail-safe:这种遍历基于容器的一个克隆。因此,对容器内容的修改不影响遍历。
5.ConcurrentHashMap
1.ConcurrentHashMap是使用了锁分段技术来保证线程安全的。(将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问)
2.ConcurrentHashMap提供了与Hashtable和SynchronizedMap不同的锁机制。Hashtable中采用的锁机制是一次锁住整个hash表,从而在同一时刻只能由一个线程对其进行操作;而ConcurrentHashMap中则是一次锁住一个桶。
3.ConcurrentHashMap默认将hash表分为16个桶,诸如get、put、remove等常用操作只锁住当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。