Map 面试

本文探讨了Java 8中hashCode的实现原理,解释了为何使用异或运算来减少碰撞。同时,详细介绍了数组扩容的过程,以及HashMap与线程安全的HashTable的区别。另外,对比了LinkedHashMap和TreeMap在数据结构和遍历效率上的差异。最后,分析了HashTable的锁机制及其对并发性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、说说 hash 的实现。为什么要这样实现?

JDK8 中,是通过 hashCode() 的高 16 位异或低 16 位实现的:(h = k.hashCode()) ^ (h >>> 16)。主要是从速度、功效和质量来考虑的,减少系统的开销,也不会造成因为高位没有参与下标的计算,从而引起的碰撞。

二、为什么要用异或运算符?

保证了对象的 hashCode 的 32 位值只要有一位发生改变,整个 hash() 返回值就会改变。尽可能的减少碰撞。

三、数组扩容的过程?

创建一个新的数组,其容量为旧数组的两倍,并重新计算旧数组中结点的存储位置。结点在新数组中的位置只有两种,原下标位置或原下标+旧数组的大小。

四、LinkedHashMap,TreeMap 有什么区别?

LinkedHashMap 保存了记录的插入顺序,在用 Iterator 遍历时,先取到的记录肯定是先插入的;遍历比 HashMap 慢;
TreeMap 实现 SortMap 接口,能够把它保存的记录根据键排序(默认按键值升序排序,也可以指定排序的比较器)

五、HashTable中的锁机制

HashTab是使用Synchronized来实现线程安全的,是使用一把锁锁住整个链表结构,效率非常低。当有一个线程访问同步方法的时候,其他线程是访问不了的,其他线程可能会被阻塞或者进入轮询状态。如果有一个线程正在执行put()操作的时候,其他线程是不可以进行put()操作的,也不可以进行get()操作,并发线程越多,竞争越激烈,效率越低下。

### Java Map 面试常见问题及答案 #### 1. **什么是 `Map` 接口及其主要实现类?** `Map` 是一种键值对映射的数据结构,在 Java 中定义了存储和检索关联键值对的方法。其主要实现类包括 `HashMap`、`TreeMap` 和 `LinkedHashMap` 等[^1]。 - `HashMap`: 基于哈希表实现,允许 null 键和 null 值,不保证迭代顺序。 - `TreeMap`: 基于红黑树实现,按键的自然顺序或指定比较器排序。 - `LinkedHashMap`: 继承自 `HashMap`,通过双向链表维护插入顺序或访问顺序。 #### 2. **`HashMap` 的底层原理是什么?** `HashMap` 使用数组加链表(或红黑树)来解决哈希冲突问题。当两个不同的键计算出相同的哈希码时,它们会被存放在同一个桶中形成链表。如果链表长度超过阈值(默认为 8),则会转换为红黑树以提高查找效率[^1]。 ```java // 示例代码展示如何创建并使用 HashMap import java.util.HashMap; public class Example { public static void main(String[] args) { HashMap<Integer, String> map = new HashMap<>(); map.put(1, "Value1"); map.put(2, "Value2"); System.out.println(map.get(1)); // 输出 Value1 } } ``` #### 3. **为什么 `ConcurrentHashMap` 是线程安全的?** `ConcurrentHashMap` 通过对分段锁机制(Segment Locking 或 CAS 操作)实现了更高的并发性能。相比传统的同步方法,它允许多个线程同时读取不同部分的数据而无需阻塞其他线程的操作[^2]。 #### 4. **`HashMap` 如何处理哈希碰撞?** 当发生哈希碰撞时,`HashMap` 将这些具有相同索引位置的对象链接成一条单向链表。随着负载因子增加到一定程度后,为了优化查询速度,某些链表可能会升级为红黑树结构。 #### 5. **`WeakHashMap` 的作用是什么?** `WeakHashMap` 是基于弱引用的一种特殊形式的地图集合。其中保存的是 key-value 对中的 keys 被封装成了 WeakReference 类型实例。这意味着即使还有对该 Key 的强引用存在,只要垃圾回收器发现没有任何非弱引用指向该对象,则可以将其清理掉从而释放内存资源[^3]。 #### 6. **`IdentityHashMap` 的特点有哪些?** 不同于普通的 `HashMap` 使用 equals 方法判断相等性,`IdentityHashMap` 利用 == 运算符来进行身份比较。因此只有完全相同的对象才能被认为是匹配项[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值