Java中HashTable和HashMap的区别_动力节点Java学院整理

  

HashMap和哈希表都实现了地图接口,但决定用哪一个之前先要弄清楚它们之间的区别。主要的区别有:线程安全性,同步(同步),以及速度。

  

HashMap几乎可以等价于Hashtable,除了HashMap是非同步的,并可以接零(HashMap允许受>   地图收藏。synchronizedMap (Map)      

,,这个方法返回一个同步的地图,这个地图封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。而且Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

  

另一个区别是HashMap的迭代器(迭代器)是快速失败迭代器,而Hashtable的枚举器迭代器不是快速失败的,所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的删除()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是枚举和迭代器的区别。

  

由于哈希表是线程安全的也是同步的,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

  

HashMap不能保证随着时间的推移中地图的元素次序是不变的。

  

哈希值的使用不同,HashTable直接使用对象的hashCode、代码是这样的:

        int散列=key.hashCode ();   int指数=(散列,0 x7fffffff) % tab.length;      

而HashMap重新计算的哈希值,而且用与代替求模:

        int散列=散列(k);   int i=indexFor(散列,table.length);      

  

1)同步进行意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新哈希表时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。

  

2)自动防故障装置和迭代器迭代器相关。如果某个集合对象创建了迭代器或者ListIterator,然后其它的线程试图”结构上“更改集合对象,将会抛出ConcurrentModificationException异常。但其它线程可以通过设置()方法更改集合对象是允许的,因为这并没有从“结构上“更改集合。但是假如已经从结构上进行了更改,再调用集()方法,将会抛出IllegalArgumentException异常。

  

3)结构上的更改指的是删除或者插入一个元素,这样会影响到地图的结构。
  

  

以上所述是小编给大家介绍的HashTable和HashMap的区别_动力节点Java学院整理,希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

Java中HashTable和HashMap的区别_动力节点Java学院整理