违法网站开发人员,深圳大鹏住房和建设局网站,网站验证码目录,学seo优化HashMap和Hashtable的比较是Java面试中的常见问题#xff0c;用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题。Hashtable是个过时的集合类#…HashMap和Hashtable的比较是Java面试中的常见问题用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题。Hashtable是个过时的集合类存在于Java API中很久了。在Java 4中被重写了实现了Map接口所以自此以后也成了Java集合框架中的一部分。Hashtable和HashMap在Java面试中相当容易被问到甚至成为了集合框架面试题中最常被考的问题所以在参加任何Java面试之前都不要忘了准备这一题。 这篇文章中我们不仅将会看到HashMap和Hashtable的区别还将看到它们之间的相似之处。 HashMap和Hashtable的区别 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中的元素次序是不变的。要注意的一些重要术语 1) sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。 2) Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator然后其它的线程试图“结构上”更改集合对象将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改再调用set()方法将会抛出IllegalArgumentException异常。 3) 结构上的更改指的是删除或者插入一个元素这样会影响到map的结构。 我们能否让HashMap同步 HashMap可以通过下面的语句进行同步Map m Collections.synchronizeMap(hashMap); 结论 Hashtable和HashMap有几个主要的不同线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable而如果你使用Java 5或以上的话请使用ConcurrentHashMap吧。转载于:https://www.cnblogs.com/kakaisgood/p/9530783.html