大家好,又见面了,我是你们的朋友全栈君。
一、HashTable
1、HashTable 是线程安全的,查看源码得知方法使用了同步锁 synchronized,
如下所示:
2、 key值不允许为null ,如果插入key 为null , 就会报null指针异常错误,如下所示:
注意:key为null,就没有hashcode,无法计算hash值
二、HashMap
1、HashMap 非线程安全 常用于单线程程序,多线程环境下可以采用concurrent并发包下的concurrentHashMap
, key值允许为null, key为null的键值对永远都放在以table[0]为头结点的链表中 ,如下所示:
2、HashMap 1.7 与 1.8 的区别
HashMap1.7 底层采用数组 链表实现
HashMap1.8底层采用数组 链表 (size>8)红黑树
3、 HashMap是如何解决hash冲突问题的
使用链表存放hash值相当且内容不等 存放到同一个链表中
4、 HashMap的pu底层是如何实现的
根据key判断为空的情况下,存放数组0
默认HashMap的初始容量为16,加载因子大小16×0.75=12 每次扩容x2倍
根据key计算hash值,存放到数组下标位置
如果当前size>加载因子阈值,开始x2倍扩容、
注意:1.8中链表长度大于8 的情况下,将链表转换为红黑树
5、HashMap的加载因子为啥是0.75
这是一个折中方案 空间利用率高 、冲突少 0.75 比较合适
6、HashMap 在1.7 数组扩容死循环问题
HashMap扩容采用了头插法
注解:
头插法就是最新的冲突存放在最最前面
尾插法就表示一直存放在最后的next
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/192855.html原文链接:https://javaforall.cn