HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的别离。次要的区别有:线程安全性,同步(synchronization),以及速度。
HashMap简直能够等价于Hashtable,除了HashMap是非synchronized的,并能够承受null(HashMap能够承受为null的键值(key)和值(value),而Hashtable则不行)。
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程平安的,多个线程能够共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的代替,比HashTable的扩展性更好。大数据培训
另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程扭转了HashMap的构造(减少或者移除元素),将会抛出ConcurrentModificationException,但迭代器自身的remove()办法移除元素则不会抛出ConcurrentModificationException异样。但这并不是一个肯定产生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
因为Hashtable是线程平安的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不须要同步,只须要繁多线程,那么应用HashMap性能要好过Hashtable。
HashMap不能保障随着工夫的推移Map中的元素秩序是不变的。
要留神的一些重要术语:
sychronized意味着在一次仅有一个线程可能更改Hashtable。就是说任何线程要更新Hashtable时要首先取得同步锁,其它线程要等到同步锁被开释之后能力再次取得同步锁更新Hashtable。
Fail-safe和iterator迭代器相干。如果某个汇合对象创立了Iterator或者ListIterator,而后其它的线程试图“构造上”更改汇合对象,将会抛出ConcurrentModificationException异样。但其它线程能够通过set()办法更改汇合对象是容许的,因为这并没有从“构造上”更改汇合。然而如果曾经从构造上进行了更改,再调用set()办法,将会抛出IllegalArgumentException异样。
构造上的更改指的是删除或者插入一个元素,这样会影响到map的构造。
咱们是否让HashMap同步?
HashMap能够通过上面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);
论断
Hashtable和HashMap有几个次要的不同:线程平安以及速度。仅在你须要齐全的线程平安的时候应用Hashtable,而如果你应用Java 5或以上的话,请应用ConcurrentHashMap吧。