博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashMap和HashTable区别
阅读量:5871 次
发布时间:2019-06-19

本文共 1322 字,大约阅读时间需要 4 分钟。

HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。HashMap和HashTable都使用哈希表来存储键值对。在数据结构上是基本相同的,都创建了一个继承自Map.Entry的私有的内部类Entry,每一个Entry对象表示存储在哈希表中的一个键值对。

Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

两者计算hash的方法不同: 

Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模: int hash = key.hashCode();int index = (hash & 0x7FFFFFFF) % tab.length; HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸:static int hash(int h) {     h ^= (h >>> 20) ^ (h >>> 12);     return h ^ (h >>> 7) ^ (h >>> 4); }static int indexFor(int h, int length) {     return h & (length-1); }
 

HashMap和HashTable都实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。

HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。

HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1。

HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashTable是线程安全的。

HashMap中key和value都允许为null。key为null的键值对永远都放在以table[0]为头结点的链表中。HashTable在遇到null时,会抛出NullPointerException异常。

HashMap仅支持Iterator的遍历方式,Hashtable支持Iterator和Enumeration两种遍历方式。

判断是否含有某个键 :

在HashMap 中,null 可以作为键,这样的键只有一个;可以有一个或多个键所对 

应的值为null。当get()方法返回null 值时,既可以表示HashMap 中没有该键,也可 
以表示该键所对应的值为null。因此,在HashMap 中不能用get()方法来判断HashM 
ap 中是否存在某个键,而应该用containsKey()方法来判断。Hashtable 的键值都不能 
为null,所以可以用get()方法来判断是否含有某个键。

 

 

转载于:https://www.cnblogs.com/aeolian/p/8468632.html

你可能感兴趣的文章
深度学习Caffe 入门理解使用教程
查看>>
nginx绑定IP的坑
查看>>
PSR-0规范
查看>>
网络基础指令
查看>>
Hadoop中的Streaming(20)
查看>>
Html body的滚动条禁止与启用
查看>>
Openstack Object Store(Swift)设置公有存储的方法
查看>>
右键打开方式添加应用程序无法设置
查看>>
PhalApi:[3.1] 扩展类库:微信开发
查看>>
Python基础07 函数
查看>>
带你彻底理解RSA算法原理
查看>>
oracle 11g 存储结构和数据文件
查看>>
python 依赖包迁移(本地安装)
查看>>
Java经典设计模式-创建型模式-单例模式(Singleton)
查看>>
JPA、Hibernate、Mybatis的区别
查看>>
Redis使用
查看>>
"errcode": 41001, "errmsg": "access_token missing hint: [w.ILza05728877!]"
查看>>
又一次寻找bug的经历...这次是 openlayers + chrome + win7
查看>>
mysql point WKB格式 php 解析 unpack
查看>>
不用 SWIG,Go 使用 C++ 代码的方式
查看>>