HashMap和Hashtable的区别
两者都实现了Map接口,区别在于:线程安全,同步,速度
-
HashMap可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
-
HashMap是非synchronized的,HashTable是synchronized的,HashTable是线程安全的,多个线程可以共享一个
HashTable;如果没有正确同步,多个线程是不能共享HashMap的,java5提供了ConcurrentHashMap,它是
HashTable的代替,比HashTable的扩展性更好 -
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,
只需要单一线程,那么使用HashMap性能要好过Hashtable。 -
HashMap不能保证随着时间的推移Map中的元素次序是不变的。
要注意的一些重要术语:
1, sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁,
其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。
2, Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator,然后其它的线程试图“结构上”
更改集合对象,将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的,
因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用set()方法,会抛出IllegalArgumentException异常。
3, 结构上的更改指的是删除或者插入一个元素,这样会影响到map的结构。