JAVA面试指南(干货持续更新~)

一、基础

1. String/StringBuffer/StringBuilder 区别

最简回答:String 是不可变的字符串,每次修改都会创建新的对象,适用于不经常
修改的字符串操作;StringBuffer 是可变的字符串,线程安全,适用于多线程环境;
StringBuilder 也是可变的字符串,但不是线程安全的,适用于单线程频繁修改字符
串的场景。

2. 反射机制及主要用到的方法

最简回答:Java 的反射机制是指在运行时动态地获取类的信息并操作类或对象的能

力。通过反射,我们可以在编译时无法确定的情况下,通过类名获取类的实例、获

取类的字段、方法、构造函数等信息,并且可以在运行时调用这些方法或访问这些

字段。

3. JVM 内存结构

最简回答:Java 的内存结构主要包括方法区、堆、虚拟机栈、本地方法栈和程序计

数器。方法区用于存储类信息,堆用于存储对象实例,虚拟机栈用于存储方法调用

和局部变量,本地方法栈用于存储非 Java 方法信息,程序计数器用于记录当前线程

执行的指令地址。

4. ==与 equals 区别

最简回答:"=="用于比较对象的引用或基本类型的值是否相等,而 equals 方法用

于比较对象的内容是否相等。换句话说,"=="比较的是身份,equals 比较的是内容

5. 接口和抽象类的区别

最简回答:接口是一种规范,它定义了一组方法的签名,而不包含具体实现。一个

类可以实现多个接口。抽象类是一种可以包含具体方法和抽象方法的类,它可以被

继承,但不能被实例化。一个类只能继承一个抽象类。

简而言之,接口关注的是行为的规范,而抽象类关注的是共享的功能。

6. 重写(override)和重载(overload)的区别

最简回答:重写(override)指的是子类重新实现了父类中已有的方法,子类的方

法具有相同的名称、参数列表和返回类型。重载(overload)指的是在同一个类中

定义了多个方法,它们具有相同的名称但参数列表不同。重写主要涉及继承和多态

性,而重载则是在同一个类中的方法之间进行区分。

简而言之,重写是对已有方法的重新实现,而重载是创建具有相同名称但不同参数的多个方法。

7. sleep 和 wait 的区别

最简回答:sleep 是线程休眠一段时间后继续执行,期间保持对象锁不释放;wait

是线程等待并释放对象锁,直到其他线程通知后才继续执行。

8. 类加载器加载过程

Java 类加载器的加载过程可以分为以下几个步骤:

  1. 加载:通过类的全限定名获取字节码文件,并将其转换为方法区内的运行时数据结
    构。
  2. 验证:对字节码进行校验,确保符合 Java 虚拟机规范。
  3. 准备:为类的静态变量分配内存,并设置默认初始值。
  4. 解析:将符号引用转换为直接引用,即将类、方法、字段等解析为具体的内存地址。
  5. 初始化:执行类的初始化代码,包括静态变量赋值和静态代码块的执行。

五、MySQL

1. 数据库的 ACID 特性

最简回答:ACID 特性是指原子性(Atomicity)、一致性(Consistency)、隔离
性(Isolation)和持久性(Durability),用于保证数据库事务的可靠性和一致性。

2. MySQL 存储引擎

最简回答:InnoDB 是 MySQL 的默认存储引擎,支持事务处理、行级锁和外键;而MyISAM 不支持事务、只有表级锁,并且不支持外键。

3. 数据库的事务隔离级别

最简回答:数据库事务隔离级别是指在多个并发事务同时执行时,各个事务之间的

隔离程度,常见的隔离级别有读未提交(Read Uncommitted)、读已提交(Read

Committed)、可重复读(Repeatable Read)和串行化(Serializable)。

4. 索引的类型(种类)

  • 从数据结构角度

树索引 (O(log(n)))

Hash 索引

  • 从物理存储角度

聚集索引(clustered index)

非聚集索引(non-clustered index)

  • 从逻辑角度

普通索引

唯一索引

主键索引

联合索引

5. MySQL 索引底层原理

最简回答:MySQL 索引底层原理使用了 B+树数据结构,它是一种平衡树,能快速

定位和检索数据;B+树的叶子节点存储实际数据,中间节点存储索引,通过减少磁

盘 IO 来提高查询效率;索引按照值的大小顺序排列,使得范围查询效率更高。

6. MySQL 优化方案

 服务器优化(增加 CPU、内存、网络、更换高性能磁盘)

 表设计优化(字段长度控制、添加必要的索引)

 SQL 优化(避免 SQL 命中不到索引的情况)

 架构部署优化(一主多从集群部署)

 分库分表(垂直分库、水平分表)

 编码优化实现读写分离

六、Redis

1. Redis 为什么快

最简回答:Redis 之所以快是因为它采用了内存存储和非阻塞的 I/O 模型,避免了
磁盘 IO 的延迟;同时,Redis 使用了IO 多路复用技术,通过一个线程同时处理多
个客户端请求,减少了线程切换的开销,提高了并发处理能力。

2. Redis 可以用来做什么

  •  缓存
  •  排行榜
  • 分布式计数器
  • 分布式锁
  • 消息队列
  • 分布式token
  • 限流

3. Redis 的持久化机制

最简回答:RDB 是 Redis 的快照持久化方式,通过周期性的快照将数据保存到硬盘,
占用更少的磁盘空间和 CPU 资源,适用于数据备份和恢复,但可能存在数据丢失的
风险。AOF 是追加日志持久化方式,将每个写操作以追加的方式记录到日志文件中,
确保了更高的数据完整性和持久性,但相对于 RDB 消耗更多的磁盘空间和写入性
能,适用于数据持久化和灾难恢复,且可以通过配置实现不同的同步频率。

4. Redis 常用的数据类型

5. Redis 的缓存穿透、缓存击穿、缓存雪崩(缓存三兄弟)

最简回答:

缓存穿透:缓存中和数据库中都没有所查询的东西,可以通过使用布隆过滤器来快速判断请求的 Key 是否合法,避免查询不存

在的数据。

缓存击穿:缓存中没有但数据库中有,可以通过使用互斥锁来保护数据库查询,确保只有一个线程能够查询数据

库并写入缓存,避免多个并发请求同时访问数据库。

缓存雪崩:缓存中的数据正好在一个时间删除,可以通过合理设置缓存的失效时间,使用热点数据预热来减少对缓存的依

赖,从而避免整个缓存层的崩溃。

6. Redis 的哨兵集群(Redis Sentinel)

最简回答:
Redis 的哨兵集群主要用于实现高可用性,监控主、从节点的状态变化,并
在主节点失效时自动将从节点升级为主节点。哨兵集群由多个哨兵节点组成,工作
原理是哨兵节点通过相互通信,监测主节点的健康状态,当主节点失效时,选举新
的主节点,并通知其他从节点进行切换,确保系统的可用性。

7. Redis 的分片集群(Redis Cluster)

最简回答:

Redis 的分片集群主要用于实现数据的横向扩展,将数据分散存储在多个节点上,

提高系统的并发能力和存储能力。分片集群由多个主从节点组成,根据 Key 经过哈希算

法映射到不同的节点上,每个节点负责存储和处理一部分数据,工作原理是通过一

致性哈希算法将数据按照一定规则分配到不同的节点上,实现数据的均衡存储和查

询。

8. Redis(或 ElasticSearch)和 MySQL 如何保持数据一

致性

最简回答:

Elasticsearch 和 MySQL 的数据一致性可以通过以下三种方案实现:

  1. 双写:每次写入操作同时将数据写入 Elasticsearch 和 MySQL,确保数据一致性,
    但可能增加写延迟和复杂性。
  2. 异步队列:将写入操作请求放入队列中,后台任务异步地将数据写入
    Elasticsearch 和 MySQL,提高写入性能,但可能导致一定的数据不一致性。
  3. Canal 方案:使用 Canal 工具订阅 MySQL 的 binlog 日志,实时将数据同步到
    Elasticsearch,实现数据的实时增量同步,但需要额外的工具和配置。

9. Redisson 是什么,怎么用

最简回答:Redisson 是一个 Java 的 Redis 客户端,提供丰富的 API 和功能,用于

封装分布式操作和并发控制。在 Spring Boot 中使用 Redisson,首先添加 Redisson

的依赖,然后在配置文件中配置 Redisson 连接信息,接着通过@Autowired 注解

或手动创建 RedissonClient 对象。最后,利用 RedissonClient 对象可以使用各种

功能,如分布式锁、分布式集合等,与 Redis 进行交互。

10. Redisson 看门狗机制的原理

最简回答:Redisson 的看门狗机制通过定时续期锁的过期时间,保证在业务执行期

间锁不会被自动释放。它解决了分布式环境下锁过期导致的资源竞争问题,确保业

务能够完成。续期是看门狗机制的核心,它通过定时更新锁的过期时间来实现锁的

持久性,以防止锁过期并被其他实例获得。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值