面试 Java 基础八股文十问十答第三十一期
作者:程序员小白条,个人博客
相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
⭐点赞⭐收藏⭐不迷路!⭐
1)TreeMap 有了解过吗?
- TreeMap 是基于红黑树(Red-Black tree)实现的,它是有序的 Map,可以根据键的自然顺序或者自定义的比较器对键进行排序。
- TreeMap 中的键值对是按照键的顺序排列的,这使得 TreeMap 在范围查询和按顺序遍历键值对时具有很高的效率。
- 注意,TreeMap 不允许键为 null,并且对键的排序是基于键的自然顺序或者比较器的,而不是插入顺序。
2)IdentityHashMap 有了解过吗?
- IdentityHashMap 是一种特殊的 Map,它使用引用相等性(reference-equality)而不是对象相等性(object-equality)来比较键。
- 在 IdentityHashMap 中,当且仅当两个键是同一个对象(即引用相等)时,它们才被认为是相等的。
- 这使得 IdentityHashMap 在需要使用引用相等性的场景下非常有用,例如需要保留对象之间的原始引用关系时。
3)WeakHashMap 有了解过吗?
- WeakHashMap 是一种弱引用(weak reference)实现的 Map,它的键被保存在弱引用中,这意味着如果键不再被其他对象引用,则可以被垃圾回收器回收。
- 当键被垃圾回收器回收时,与该键相关联的值也会被移除,这样可以避免内存泄漏。
- WeakHashMap 主要用于缓存和对象关联性映射等场景,在需要动态管理缓存内容或者避免内存泄漏时非常有用。
4)ConcurrentHashMap 1.7 和 1.8 的区别:
在 Java 7 中,ConcurrentHashMap 的实现采用了分段锁机制,即将整个 Map 分成多个段(Segment),每个段都拥有自己的锁。这种设计在高并发情况下可以提高并发性能,因为不同的线程可以同时访问不同的段,从而减少了锁的竞争。
而在 Java 8 中,ConcurrentHashMap 的实现引入了 CAS(Compare and Swap)操作和 synchronized 实现的方法,用以替代分段锁机制。这种设计使得 ConcurrentHashMap 在高并发情况下表现更好,因为它可以利用更细粒度的锁粒度,减少了锁的竞争。
5)ConcurrentHashMap#get 需要加锁吗?
ConcurrentHashMap 的 get 操作不需要加锁。因为 ConcurrentHashMap 使用了并发安全的数据结构和算法来实现,其中包括使用 volatile 变量和 CAS 操作来确保数据的一致性,所以 get 操作是线程安全的,不需要额外的加锁操作。
6)为什么 ConcurrentHashMap 不支持 key 或者 value 为 null ?
ConcurrentHashMap 不支持 key 或者 value 为 null 是为了避免出现歧义和不确定性。在 ConcurrentHashMap 中,null 通常被用作特殊值来表示键或值不存在。如果允许键或值为 null,那么在查询时无法确定是键或值本身为 null 还是表示键或值不存在。为了保持数据结构的一致性和操作的可预测性,ConcurrentHashMap 不支持 key 或者 value 为 null。
7)Copy-On-Write:
Copy-On-Write 是一种并发编程中的策略,它用于处理读写冲突。当有写操作发生时,Copy-On-Write 策略不会直接在原始数据上进行修改,而是先复制一份原始数据,然后在副本上进行修改,最后再将副本的引用指向修改后的数据。这样做的好处是读操作可以并发进行,不会被写操作所影响,从而提高了读操作的性能。Copy-On-Write 主要应用于需要频繁读取但很少修改的情况,比如事件监听器列表。
8)ConcurrentModificationException:
ConcurrentModificationException 是 Java 集合框架中常见的异常之一,通常在使用迭代器遍历集合时出现。这个错误的主要原因是在迭代过程中,集合的结构发生了改变(比如添加或删除元素),导致迭代器检测到集合被并发修改而抛出异常。
这种异常的出现通常是由于多个线程并发地修改了集合,而不是使用线程安全的集合类。解决这个问题的方法之一是使用线程安全的集合类,如 ConcurrentHashMap,或者在迭代过程中使用同步措施来防止并发修改。
9)ConcurrentHashMap 的 put 过程:
ConcurrentHashMap 的 put 方法主要包括以下几个步骤:
- 计算键的哈希值。
- 根据哈希值定位到相应的段(Segment)。
- 在段内部进行插入操作,可能涉及到扩容或者链表转换为红黑树等操作。
- 如果需要,更新计数器以及执行相关的并发控制操作。
ConcurrentHashMap 的 put 方法是线程安全的,多个线程可以同时进行插入操作而不会发生数据不一致或者丢失的情况。
10)fail-fast 机制的作用:
fail-fast 是一种迭代器的工作方式,在迭代器遍历集合时,如果集合的结构发生了改变,迭代器会立即抛出 ConcurrentModificationException 异常,以避免在并发修改的情况下导致不确定的行为。这种机制的作用是尽早检测到并发修改,防止其对其他线程造成影响,并提高了程序的健壮性。fail-fast 机制是 Java 集合框架中的一种常见实现方式,用于保证迭代器的安全性和一致性。
开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
前后端总计已经 1300+ Star,2 W+ 访问!
⭐点赞⭐收藏⭐不迷路!⭐