hashMap和hashTable的不同之处

https://blog.csdn.net/zhaoshuai_01/article/details/107757654

hashMap和hashTable的不同之处

hashMap
1、1.7 添加元素时,首先通过hash方法获取哈希值,通过indexFor方法获取索引,在1.8版本中,indexFor取消了,直接使用数组长度-1取模hash值得方式获取
2、1.7 hashMap的数据结构为数组+链表,在1.8版本中,数据结构采用的是数组+链表/红黑树,链表或者红黑树的处理方式为:当链表深度达到默认值8时,会扩容自动转为红黑树,转为红黑树的目的是,查询索引位置会更快,当深度小于6时,红黑树会再次转换为链表
3、1.7 hashMap插入数据采用的是头插入法,就相当于压栈操作,新加入的元素始终在数组的索引处,而非下挂的链表处,这样就会产生环链的问题。在1.8版本中,采用的是尾插入法,因为使用了红黑树可以避免环链问题的产生。
4、扩容机制:JDK1.7用了9次扰动处理=4次位运算+5次异或,而JDK1.8只用了2次扰动处理=1次位运算+1次异或。
5、1.7 在put的操作时需要扩容操作,先扩容后put 在1.8版本中刚好相反

hashMap和hashTable?
1、hashMap的键值都允许为null hashTable不允许
2、hashMap的初始容量大小为16 hashTable的初始容量为11
3、扩容:hashMap的扩容原数组长度2 hashTable的扩容原数组长度2+1
4、hashMap线程不安全 hashTable线程安全
5、hashMap效率高于hashTable
6、计算hash值的方式不同

扩展
hash是一种散列算法,根据输入的值计算出一组散列值
同一散列函数 散列值如果不同,输入值一定不相同
同一散列函数 如果散列值相同,输入值不一定相同

集中常见的hash函数
1、直接定址法:直接以key+常数作为hash地址
2、除留余数法:key除以不大于hash表长度的值,将余数作为哈希地址
3、数字分析法:提取key中的数字作为哈希地址
4、随机数法:将随机数作为哈希地址

hash碰撞:
两个不同的值 通过同一哈希函数 得到的地址相同称之为hash碰撞

解决hash碰撞的集中方法:
1、开放定址法:一旦发生冲突,就会去寻找下一个散列地址值
2、链地址法:数组加链表结构,都发生碰撞时,会将发生碰撞的输入值,链接到该数组对应元素的下方
3、再哈希法:当发生hash碰撞时,使用另外的hash函数进行计算hash地址,直到不产生冲突为止。
4、建立溢出区:将hash表分为基础表和溢出表 发生hash碰撞的元素放入溢出表中。

hashmap的数据结构 就是使用的是 数组+链表的方式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值