文档章节

java HashMap与Hashtable区别

 随性_
发布于 2016/05/11 10:39
字数 522
阅读 159
收藏 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)

 

© 著作权归作者所有

粉丝 10
博文 25
码字总数 29857
作品 0
南昌
私信 提问
加载中

评论(0)

面试题·HashMap和Hashtable的区别(转载再整理)

原文链接: Javarevisited 翻译: ImportNew.com - 唐小娟译文链接: http://www.importnew.com/7010.html HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用...

osc_foo7glsg
2019/02/25
7
0
HashMap和Hashtable的区别

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

LCZ777
2014/03/29
118
0
HashMap和Hashtable 线程安全性

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

osc_m1w0us5v
2018/08/24
1
0
Hashtable 为什么不叫 HashTable?

前几天在写《HashMap 和 Hashtable 的 6 个区别》这篇文章的时候,差点把 Hashtable 写成了 HashTable,后来看源码证实了是:Hashtable,小写的 "t"able,不符合驼峰命名规则。 什么是驼峰命...

Java技术栈
2018/12/10
66
1
HashMap 与HashTable的区别

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

osc_9fryb40x
2018/07/27
4
0

没有更多内容

加载失败,请刷新页面

加载更多

基于Centos7系统一键部署EFK服务

最近平台EFK版本均作了升级,平台采用EFK(ElasticSearch-7.6.2 + FileBeat-7.6.2 + Kibana-7.6.2)架构。这里建议三个组件主次版本保持一致。考虑到服务器比较多,所以写成脚本来批量部署。 ...

linuxprobe2020
今天
23
0
检查键是否存在于JavaScript对象中? - Checking if a key exists in a JavaScript object?

问题: How do I check if a particular key exists in a JavaScript object or array? 如何检查JavaScript对象或数组中是否存在特定键? If a key doesn't exist, and I try to access it, ......

fyin1314
今天
27
0
jasypt-spring-boot提示Failed to bind properties

1 问题描述 在Spring Boot中使用jasypt-spring-boot进行加密,但是提示: Description:Failed to bind properties under 'spring.datasource.password' to java.lang.String: Reason:......

氷泠
今天
29
0
在git 2.13之前,只保存多个已更改的文件中的一个文件

问题: 如何在我的分支上只隐藏多个已更改文件中的一个? 解决方案: 参考一: https://stackoom.com/question/Cl3h/在git-之前-只保存多个已更改的文件中的一个文件 参考二: https://oldb...

技术盛宴
今天
30
0
SQL笔记:把Excel的数据导入MySQL中作运算

很多Excel用户都知道,Excel单个工作簿单张表存储的数据量很有限(旧版本月60多万条记录,新版本也才104万条不到),而且Excel中,因为自带各种格式与公式,兼之高度封装性等原因,导致Excel...

tengyulong
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部