hashmap特性
hashmap 可以实现快速存取 key 允许为null
非同步 线程不安全
底层时hash表
负载因子是0.75
hashmap 的底层实现原理
底层时数组加链表 put get存取对象 当执行put 方法时 , 先对键值计算hashcode()得到它在bucket数组的位置。获取对象时,先得到bucket的位置 在调用equals 找到需要的值。
put 方法的流程
- 计算机hashcode
- 判断hash表是否为空
- 发生碰撞放到散列表里去
- hashcode 值相同 三种情况
- equals 判断是否有相同 相同就替换
- 红黑树就调用红黑树的插入方法
- 链表就在尾部插入 如果插入链表个数为8 就转变为红黑树
- 如果满了就扩容。
hashmap 什么时候需要扩容
- 通过判断数组容量是否大于0 判断数组是否初始化过
- 没有初始化
- 是否初始化默认大小
- 是否初始化容量
- 扩容两倍将元素重新运算复制到新的散列表中
- 是否初始化默认大小
5.谈一下hashMap中get是如何实现的?
对key的hashCode进行hashing,与运算计算下标获取bucket位置,如果在桶的首位上就可以找到就直接返回,否则在树中找或者链表中遍历找,如果有hash冲突,则利用equals方法去遍历链表查找节点。
hashmap 和 hashtable 的区别
相同点
都是key-value 存储
- HashMap允许Key-value为null,hashTable不允许;
- hashMap没有考虑同步,是线程不安全的。hashTable是线程安全的,给api套上了一层synchronized修饰;
- hashmap 的初始容量是16 hashtable 的初始容量是 11 (2*n+1)
- hashmap 自定义的hash算法 hashtable 没有自定义hash算法
- HashMap允许Key-value为null,hashTable不允许;
loadfactor
- 表示hash 表的拥挤程度