Java 集合面试题, 为什么 Java 的 ConcurrentHashMap 不支持 key 或 value 为 null?
Java 集合面试题, 为什么 Java 的 ConcurrentHashMap 不支持 key 或 value 为 null?
QA
Step 1
Q:: 为什么 Java 的 ConcurrentHashMap 不支持 key 或 value 为 null?
A:: ConcurrentHashMap 设计上为了并发安全,使用了分段锁和其他并发控制机制。支持 null 值会导致复杂的并发处理逻辑。比如,当一个线程读取一个可能为 null 的值时,另一个线程可能正在写入这个值,这会带来不可预测的行为。此外,null 值在哈希映射中的语义不明确(是没有这个键还是键的值为 null),这会增加代码的复杂性。
Step 2
Q:: Java 集合框架中有哪些常见的接口和类?
A:: Java 集合框架包含了一些关键接口如:Collection、Set、List、Map 等。常见实现类有:ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap 等。这些接口和类提供了对集合数据结构的标准操作,如添加、删除、查找、遍历等。
Step 3
Q:: 如何在生产环境中有效使用 ConcurrentHashMap?
A:: 在生产环境中,ConcurrentHashMap 通常用于需要高并发访问和修改的场景。使用时应注意:1. 尽量减少对同一键的高频读写操作。2. 使用适当的初始容量和并发级别参数,以减少扩容和锁竞争。3.
尽量避免长时间持有锁,可以利用 computeIfAbsent 等方法来减少显式锁操作。
Step 4
Q:: Java 中 Synchronized 和 ReentrantLock 有什么区别?
A:: Synchronized 是 Java 语言内置的同步机制,使用方便且性能较好,但功能较简单。ReentrantLock 是 JDK 提供的更灵活的锁机制,支持公平锁、非公平锁、可重入锁、条件锁等高级功能,但使用稍复杂。选择时一般根据需求的复杂性来定。