Java集合框架 Hashmap

Java集合框架 Hashmap

1. 数据结构
Hashmap的基本实现是通过数据+链表的方式来存储一对键值对<Key,Value>其中,key和value都可以为任意类型的值,包括null。

在这里插入图片描述
在put方法的过程中,首先将key通过hash函数,转化为一个int类型的哈希值,将这个值作为索引放入hashmap之中。
如果出现两个hash值相等的情况,则使用拉链法,将其作为一个entry加入到数组位置后对应的列表中去。在jdk1.8之后,如果链表长度超过八个,则在列表尾部转化为红黑树来提高效率。

什么时候扩容:当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阈值—即当前数组的长度乘以加载因子的值的时候,就要自动扩容啦。2. indexFor计算位置
为什么hashmap的长度是2的幂次方?

每一次put操作结束的时候都要进行判断是否扩容,如果扩容则长度变为原来的两杯并进行indexFor重新放入数据。

答案:indexFor语句中源码为 (n-1) & hash ,n代表数组长度。因为取模操作,所以需要2的幂次方来提高效率。

3.Hashmap和Hashtable的区别
1) 默认长度hashtable 11,hashmap 16。算index的时候hashmap用hash函数,hashtable用hashcode
2)hashtable线程安全,但是效率低,而且已经被淘汰,建议用concurrenthashmap
3)hashtable不可以用null作为键值
4)hashtable没有红黑树结构

4.hashmap的遍历
可以用for each的entryset方法,也可以用foreach的keyset方法来进行遍历

5.hashmap和hashset的区别
hashset的底层原理都是用hashmap实现的,hashset仅存储对象,并且key值不能重复

hashset需要重写equals和hashcode方法,并且使用add来添加元素
hashset相对hashmap较慢

6.hashmap jdk 1.7死锁问题
jdk1.7 hashmap 高并发死锁是由于resize()过程中会有指定next的过程,多线程可能会造成环形链表。jdk1.8中通过对index的与值操作,将链表分成lohead和highhead规避了这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值