hashmap hashtable 的区别
来源:互联网 发布:战之海贼海贼数据 编辑:程序博客网 时间:2024/05/17 02:51
Hashtable 和 HashMap 做为 Map 的基本特性,两者都实现了Map接口,基本特性相同
- 对同一个Key,只会有一个对应的value值存在
- 如何算是同一个Key? 首先,两个key对象的hash值相同,其次,key对象的equals方法返回真
内部数据结构—Hashtable和HashMap的内部数据结构相似
其基本内部数据结构是一个Entry数组 (transient Entry[] table)
- 数组元素为实现Map.Entry<K,V>接口的类,Hashtable和HashMap各自实现了自己的Entry类。
- Entry包含一个Key-value对,以及一个next指针指向另一个Entry。多个Entry可以组成一个单向链表。
常用操作
1、数据插入操作: put(key,value)
- 根据Key的hash值计算出该Entry所应存放的位置(数组下标)
- 若该数组元素为空,直接放置Entry到此处
- 若多个不同的Key所计算得到的数组下标相同,新加入的Key-value对(Entry)会被加入到Entry单向链表中。Hashtable和HashMap
都是将其插入链表首部.
- 若已经有相同的Key存在于这个链表中,则,新的value值会取代老的value
- 当Map中存放的Entry数量超过其限制( 数组长度 * 负荷因子)时,Map将自动重新调整数组大小并重新对Entry进行散列
2、数据查找:get(key)
- 根据Key的hash值计算出该Entry对所应存放的位置(数组下标)
- 得到该位置的第一个Entry对象,比较key和Entry.key,若hash值相同,并且equals为真,则该Entry是我们要找的Key-value对,否则
继续沿next指针构成的单向链表查找
3、数据移除:remove(key)
- 按照上述数据查找的方式找到key所在的Entry对象,将其移除,并保持Entry单向链表的连通性
Hashtable 和 HashMap 的比较
Hashtable
HashMap
并发操作
使用同步机制,
实际应用程序中,仅仅是Hashtable本身的同步并不能保证程序在并发操作下的正确性,需要高层次的并发保护。
下面的代码试图在key所对应的value值等于x的情况下修改value为x+1
{
value = hashTable.get(key);
if(value.intValue()== x){
hashTable.put(key, new Integer(value.intValue()+1));
}
}
如2个线程同时执行以上代码,可能放入不是x+1,而是x+2.
没有同步机制,需要使用者自己进行并发访问控制
数据遍历的方式
Iterator 和 Enumeration
Iterator
是否支持fast-fail
用Iterator遍历,支持fast-fail
用Enumeration不支持fast-fail.
支持fast-fail
是否接受值为null的Key 或Value?
不接受
接受
根据hash值计算数组下标的算法
当数组长度较小,并且Key的hash值低位数值分散不均匀时,不同的hash值计算得到相同下标值的几率较高
hash = key.hashCode();
index=(hash&0x7FFFFFFF) % tab.length;
优于hashtable,通过对Key的hash做移位运算和位的与运算,使其能更广泛地分散到数组的不同位置
hash = hash (k);
index = indexFor(hash, table.length);
static int hash(Object x) {
int h = x.hashCode();
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static int indexFor(int h, int length) {
return h & (length-1);
}
Entry数组的长度
Ø 缺省初始长度为11,
Ø 初始化时可以指定initial capacity
Ø 缺省初始长度为16,
Ø 长度始终保持2的n次方
Ø 初始化时可以指定initial capacity,若不是2的次方,HashMap将选取第一个大于initial capacity 的2n次方值作为其初始长度
LoadFactor负荷因子
0.75
负荷超过(loadFactor * 数组长度)时,内部数据的调整方式
扩展数组:2*原数组长度+1
扩展数组: 原数组长度 * 2
两者都会重新根据Key的hash值计算其在数组中的新位置,重新放置。算法相似,时间、空间效率相同
一般情况下,HashMap能够比Hashtable工作的更好、更快,主要得益于它的散列算法,以及没有同步。应用程序一般在更高的层面上实 现了保护机制,而不是依赖于这些底层数据结构的同步,因此,HashMap能够在大多应用中满足需要。推荐使用HashMap,如果需要同步,可以使用同 步工具类将其转换成支持同步的HashMap。
0 0
- hashmap hashtable 的区别
- HashTable,HashMap的区别
- hashmap hashtable 的区别
- hashmap hashtable 的区别
- hashmap hashtable 的区别
- hashmap hashtable 的区别
- hashmap hashtable 的区别
- hashmap hashtable 的区别
- Hashtable HashMap 区别 Hashtable的劣势
- 什么是HashTable?HashMap和HashTable的区别
- HashTable和HashMap的区别
- HashTable和HashMap的区别
- Hashtable和HashMap的区别
- HashTable和HashMap的区别
- Hashtable和HashMap的区别
- Hashtable和HashMap的区别
- HashTable和HashMap的区别
- HashTable和HashMap的区别
- 查看当前用户下所有的表中每个表的条目数
- cinnamon 桌面卡住的一种情况
- n个数里面找出最大的m个数字(快排思想)
- Git学习笔记(一) 本地Git
- L脚本语言例子-封装数学函数类
- hashmap hashtable 的区别
- git是什么?如何使用git进行团队协作?
- Java加密技术(五)——非对称加密算法的由来DH
- 第一个Visual C++程序—HelloWorld
- 字符串匹配算法(KMP、BM和Sunday),及Python实现
- 小白linux学习旅途---目录权限重要知识点
- Android学习UI
- Revit开发参数读取
- Windows数据类型与API函数(MessageBox函数 和 ReadFile函数)