Java中HashTable和HashMap的区别_动力节点Java学院整理
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学院整理,希望对大家有所帮助
推荐阅读
-
Java中HashTable和HashMap的区别_动力节点Java学院整理
-
ByteArrayInputStream简介和使用_动力节点Java学院整理
-
ArrayList详解和使用示例_动力节点Java学院整理
-
ByteArrayOutputStream简介和使用_动力节点Java学院整理
-
Java 中HashCode作用_动力节点Java学院整理
-
Java中的FileInputStream 和 FileOutputStream 介绍_动力节点Java学院整理
-
mybatis实现表与对象的关联关系_动力节点Java学院整理
-
Java中的HashSet详解和使用示例_动力节点Java学院整理
-
Java 中的HashMap详解和使用示例_动力节点Java学院整理
-
Java中struts2和spring MVC的区别_动力节点Java学院整理