\t在拉链法中 , 如果hash冲突特别严重 , 则会导致数组上挂的链表长度过长 , 性能变差 , 因此在链表长度大于8时 , 将链表转化为红黑树 , 可以提高遍历链表的速度 。
22.HashMap多线程操作导致死循环问题知道吗?在jdk1.7之前 , 主要原因在于并发下的 Rehash 会造成元素之间会形成一个循环链表 。 不过 , jdk 1.8 后解决了这个问题 , 但是还是不建议在多线程下使用 HashMap因为多线程下使用 HashMap 还是会存在其他问题比如数据丢失 。 并发环境下推荐使用 ConcurrentHashMap。
23.说说LinkedHashMap 的实现原理?HashMap
accessOrder
24.说说HashMap 和 HashSet 区别?HashSet
底层就是基于 HashMap
实现的 。 两者主要区别:
HashMap | \t\t\tHashSet |
---|---|
实现了 Map 接口 | \t\t\t实现了 set 接口 |
存储键值对 | \t\t\t存储对象 |
key 唯一 , value不唯一 | \t\t\t存储对象唯一 |
HashMap使用键(Key )计算Hashcode | \t\t\tHashSet 使用成员对象来计算 hashcode 值 , 对于两个对象来说 hashcode 可能相同 , 所以equals()方法用来判断对象的相等性 |
速度相对较快 | \t\t\t速度相对较慢 |
- 线程是否安全:
HashMap
是非线程安全的 ,Hashtable
是线程安全的因为 Hashtable 内部的方法基本都经过synchronized
修饰 。 (如果你要保证线程安全的话就使用ConcurrentHashMap
吧!)
- **效率:**因为Hashtable加了
synchronized
锁 。 所以HashMap 要比 Hashtable 效率高一点 。 另外 , Hashtable 基本被淘汰 , 不要在代码中使用它
- 对 Null key 和 Null value 的支持:
HashMap
可以存储 null 的 key 和 value , 但 null 作为键只能有一个 , null 作为值可以有多个;Hashtable
不允许有 null 键和 null 值 , 否则会抛出NullPointerException
。
- 初始容量大小和每次扩充容量大小的不同 :
- ① 创建时如果不指定容量初始值 , Hashtable 默认的初始大小为
11
, 之后每次扩充 , 容量变为原来的2n+1
。 HashMap 默认的初始化大小为16
。 之后每次扩充 , 容量变为原来的2
倍 。
- ② 创建时如果给定了容量初始值 , 那么 Hashtable 会直接使用你给定的大小 , 而
HashMap
会将其扩充为 2 的幂次方大小 。 也就是说HashMap
总是使用 2 的幂作为哈希表的大小 。
- 底层数据结构:JDK1.8 以后的
HashMap
在解决哈希冲突时有了较大的变化 , 当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断 , 如果当前数组的长度小于 64 , 那么会选择先进行数组扩容 , 而不是转换为红黑树)时 , 将链表转化为红黑树 , 以减少搜索时间 。 Hashtable 没有这样的机制 。
TreeMap
和 HashMap
都继承自 AbstractMap
, 但是需要注意的是 TreeMap
它还实现了 NavigableMap
接口和 SortedMap
接口 。- 实现
NavigableMap
接口让TreeMap
有了对集合内元素的搜索的能力 。
- 实现
SortedMap
- 顶固集创与中国电信研究院、中山大学战略合作|定制快讯| 中国电信研究院
- 因全球范围内专利发明表现突出 蚂蚁集团入选2022年《全球百强
- 苹果|不用iPhone!苹果员工集体要换安卓手机:原因曝光
- javascript|JavaScript设置页面元素的滚动条一直最下方
- 安卓|不用iPhone!苹果员工集体要用安卓手机:原因是为防公司窥探
- 集成电路|春节后这些行业人才需求看涨,上海求职者最“卷”
- 监管部门|警惕以元宇宙名义非法集资
- 小米投资光莱弗利科技,经营范围含集成电路销售
- exynos|三星芯片遭手机部门嫌弃?集团内部讨论,可能砍掉Exynos项目!
- 集团企业采购的高端商务本有哪些门道?