当前位置: 移动技术网 > IT编程>开发语言>Java > Java中HashTable和HashMap的区别_动力节点Java学院整理

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

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

hashmap几乎可以等价于hashtable,除了hashmap是非synchronized的,并可以接受null(hashmap allows one null key and any number of null values.,而hashtable则不行)。这就是说,hashmap中如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containkey()方法来区别这两种情况。

hashmap是非synchronized,而hashtable是synchronized,这意味着hashtable是线程安全的,多个线程可以共享一个hashtable;而如果没有正确的同步的话,多个线程是不能共享hashmap的。 即是说,在多线程应用程序中,不用专门的操作就安全地可以使用hashtable了;而对于hashmap,则需要额外的同步机制。但hashmap的同步问题可通过collections的一个静态方法得到解决:

    map collections.synchronizedmap(map m)

   这个方法返回一个同步的map,这个map封装了底层的hashmap的所有方法,使得底层的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中的元素次序是不变的。

哈希值的使用不同,hashtable直接使用对象的hashcode,代码是这样的:

 int hash = key.hashcode();
   int index = (hash & 0x7fffffff) % tab.length;

而hashmap重新计算hash值,而且用与代替求模:

int hash = hash(k);
int i = indexfor(hash, table.length);

要注意的一些重要术语:

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

2) fail-safe和iterator迭代器相关。如果某个集合对象创建了iterator或者listiterator,然后其它的线程试图“结构上”更改集合对象,将会抛出concurrentmodificationexception异常。但其它线程可以通过set()方法更改集合对象是允许的,因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用set()方法,将会抛出illegalargumentexception异常。

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

以上所述是小编给大家介绍的hashtable和hashmap的区别_动力节点java学院整理,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网