面试 Java 基础八股文十问十答第三十一期

ops/2024/9/24 10:25:02/

面试 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 方法主要包括以下几个步骤:

  1. 计算键的哈希值。
  2. 根据哈希值定位到相应的段(Segment)。
  3. 在段内部进行插入操作,可能涉及到扩容或者链表转换为红黑树等操作。
  4. 如果需要,更新计数器以及执行相关的并发控制操作。

ConcurrentHashMap 的 put 方法是线程安全的,多个线程可以同时进行插入操作而不会发生数据不一致或者丢失的情况。

10)fail-fast 机制的作用:

fail-fast 是一种迭代器的工作方式,在迭代器遍历集合时,如果集合的结构发生了改变,迭代器会立即抛出 ConcurrentModificationException 异常,以避免在并发修改的情况下导致不确定的行为。这种机制的作用是尽早检测到并发修改,防止其对其他线程造成影响,并提高了程序的健壮性。fail-fast 机制是 Java 集合框架中的一种常见实现方式,用于保证迭代器的安全性和一致性。

开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system

前后端总计已经 1300+ Star,2 W+ 访问!

⭐点赞⭐收藏⭐不迷路!⭐


http://www.ppmy.cn/ops/37380.html

相关文章

C语言判断字符旋转

前言 今天我们使用c语言来写代码来实现字符串选择的判断,我们来看题目 题目描述 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1 AABCD和s2 BCDAA,返回1 给定s1abcd和s2ACBD,返回0. A…

C语言程序的编译与链接过程

在编写C语言程序时,我们通常只是编写源代码(.c文件),但要让计算机真正执行这些代码,还需要经过编译和链接两个主要步骤。下面,我们将详细解析这两个过程。 一、编译过程 编译是将源代码(.c文件…

7-96 n!

输入一个非负整数n,求n!。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据输入一个整数n(0≤n≤10000)。 输出格式: 对于每组测试,输出整数n的阶乘。 输入样例: 5输出样例: 120出处: HDOJ 1042 参考代码 #include<stdio.h> #include<string.h&…

聊聊 ASP.NET Core 中间件(二):中间件和筛选器的区别

前言 有些小伙伴看到上一篇文章后&#xff0c;可能会发现中间件和我们之前讲的筛选器非常类似&#xff0c;比如它们都是通过 next 串起来的一系列的组件&#xff0c;并且都可以在请求处理前后执行代码&#xff0c;都可以通过不执行 next 来进行请求的终止。那么筛选器和中间件…

java 推箱子

说明&#xff1a;刚入门的时候面试&#xff0c;有个老师傅说&#xff0c;你们喜欢打游戏&#xff0c;让你们写个简单的推箱子&#xff0c;能写出来就过 我说这多简单 结果说要用枚举类&#xff0c;数组来写 写得一踏糊涂&#xff0c;最后没通过 如今工作两年了&#xff0c;…

保持亮灯:监控工具如何确保 DevOps 中的高可用性

在快速发展的 DevOps 领域&#xff0c;保持高可用性 (HA) 至关重要。消费者期望应用程序具有全天候响应能力和可访问性。销售损失、客户愤怒和声誉受损都是停机的后果。为了使 DevOps 团队能够在问题升级为中断之前主动检测、排除故障并解决问题&#xff0c;监控工具成为这种情…

代码随想录第三十八天(完全背包问题)|爬楼梯(第八期模拟笔试)|零钱兑换|完全平方数

爬楼梯&#xff08;第八期模拟笔试&#xff09; 该题也是昨天的完全背包排列问题&#xff0c;解法相同&#xff0c;将遍历顺序进行调换 import java.util.*; public class Main{public static void main (String[] args) {Scanner scnew Scanner(System.in);int nsc.nextInt(…

五一 大项目

Docker 中的 Nginx 服务为什么要启用 HTTPS 一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos…