java HashMap与Hashtable区别
博客专区 > 随性_ 的博客 > 博客详情
java HashMap与Hashtable区别
随性_ 发表于2年前
java HashMap与Hashtable区别
  • 发表于 2年前
  • 阅读 75
  • 收藏 2
  • 点赞 2
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: 该文持续修正这二者的区别

1.HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。 

2.HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

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

关于fail-fast的机制,请点这里http://blog.csdn.net/chenssy/article/details/38151189

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

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

相应例子:

public class HashObject {

    public static void main(String[] args){
        HashMap hashMap = new HashMap();
        long map_put_start = System.currentTimeMillis();
        for (int i=0; i<1000000; i++){
            hashMap.put(i, i+"a");
        }
        System.out.println("hashmap put consume time:"+ (System.currentTimeMillis() - map_put_start) + "ms");

        Hashtable hashtable = new Hashtable();
        long table_put_start = System.currentTimeMillis();
        for (int i=0; i<1000000; i++){
            hashtable.put(i, i+"a");
        }
        System.out.println("hashtable put consume time:"+ (System.currentTimeMillis() - table_put_start) + "ms");

        long map_get_start = System.currentTimeMillis();
        for(Object entry: hashMap.entrySet()){}
        System.out.println("hashmap get consume time:"+ (System.currentTimeMillis() - map_get_start) + "ms");

        long table_get_start = System.currentTimeMillis();
        for(Object entry: hashtable.entrySet()){}
        System.out.println("hashtable get consume time:"+ (System.currentTimeMillis() - table_get_start) + "ms");

    }
}

结果:

hashmap put consume time:140s
hashtable put consume time:1578s
hashmap get consume time:17s
hashtable get consume time:20s

在测试过程当中,发觉Hashtable容量比HashMap会小;当容量为10000000时;HashTable会报堆栈溢出;

hashmap put consume time:14927s
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Hashtable.put(Hashtable.java:569)
	at com.sishuok.es.common.utils.java.HashObject.main(HashObject.java:22)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

 

共有 人打赏支持
粉丝 7
博文 16
码字总数 18722
×
随性_
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: