\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- meta|促进更逼真AR/VR体验,Meta正在开发全新空间音频工具
- 创业|八成互联网电视非法采集用户数据, 彩电企业怎么办?
- 肺炎患者|为何新冠患者已退烧,还需进行集中治疗
- 无人驾驶|189元Ticwatch GTK智能手表上手评测:颜值、运动、电量集一身,香
- 189元Ticwatch GTK智能手表上手评测:颜值、运动、电量集一身,香
- 微信|微信官宣:新增2大重要新功能,1个好评如潮,1个遭网友集体吐槽
- Java|干翻小米,红米又出超大杯旗舰,120W+2K直屏+双旗舰芯
- 百度地图|Java程序员应知应会之Maven和Gradle的区别
- javascript|穿戴设备将迎变革,OPPO又增新专利,能提升模式切换效率!
- Java|Gamamobi CEO黄继德:我们的元宇宙游戏不担心体验落差
