文档章节

java HashMap与Hashtable区别

 随性_
发布于 2016/05/11 10:39
字数 522
阅读 92
收藏 2

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)

 

© 著作权归作者所有

共有 人打赏支持
粉丝 9
博文 16
码字总数 18722
作品 0
南昌
私信 提问
HashMap和Hashtable的区别

HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问...

LCZ777
2014/03/29
0
0
Hashtable 和 HashMap 的区别

类定义 这个从源码中可以直接看出来,HashMap 继承自 AbstractMap,而 Hashtabl 继承自 Dictionary。 2. 线程安全性 Hashtable 在很多方法定义时都会加上 关键字,说明 Hashtabl 是线程安全的...

firepation
08/09
0
0
HashMap Hashtable区别

分类: java基础2009-02-24 17:26 21310人阅读 评论(3) 收藏 举报 hashmapnulldictionarytableclassobject http://blog.csdn.net/java2000net/archive/2008/06/05/2512510.aspx 我们先看2个类......

heiyexue
2015/08/22
0
0
HashMap与Hashtable的区别是面试中经常遇到的一个问题。这个问题看似简单,但如果深究进去,也能了解到不少知识。本文对两者从来源、特性、算法等多个方面进行对比总结。力争多角度、全方位的展示二者的不同,做到此问题的终结版。

HashMap与Hashtable的区别是面试中经常遇到的一个问题。这个问题看似简单,但如果深究进去,也能了解到不少知识。本文对两者从来源,特性,算法等多个方面进行对比总结。力争多角度,全方位的...

黑泽明军
04/07
0
0
集合——HashMap和Hashtable的区别

HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。 HashMap几乎可以等价于Hashtable,除了H...

亚特兰缇斯
2015/03/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

磁饱和

定义 磁饱和是磁性材料的一种物理特性,指的是导磁材料由于物理结构的限制,所通过的磁通量无法无限增大,从而保持在一定数量的状态。 举例说明 假定有一个电磁铁,通上一个单位电流的时候,...

colinux
30分钟前
1
0
Apache日志不记录访问静态文件,访问日志切割,静态元素过期时间设置

Apache配置不记录访问静态文件的日志 网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录 vhost原始配置 <VirtualHost *:80> ServerAdmin test@163.com DocumentRoo...

野雪球
今天
3
0
聊聊storm的ICommitterTridentSpout

序 本文主要研究一下storm的ICommitterTridentSpout ICommitterTridentSpout storm-core-1.2.2-sources.jar!/org/apache/storm/trident/spout/ICommitterTridentSpout.java public interface......

go4it
今天
4
0
Ubuntu常用操作

查看端口号 netstat -anp |grep 端口号 查看已使用端口情况 netstat -nultp(此处不用加端口号) netstat -anp |grep 82查看82端口的使用情况 查找被占用的端口: netstat -tln netstat -tl...

hc321
昨天
3
0
网站cdn的静态资源突然访问变的缓慢,问题排查流程

1.首先我查看了一下是否自己的网络问题,通过对比其他资源的访问速度和下载速度,确认不是 2.通过ping 和 tracert 判断cdn域名能否正常访问,(最后回想感觉这一步可以省略,因为每次最终能访...

小海bug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部