Java 100 道面试题 - 基础篇
Java基础是后端开发的基石。在面试中,面试官往往通过考察Java基础来判断候选人的代码规范性和底层理解能力。以下精选了10道高频基础题。
1. 面向对象的三大特性是什么?
封装、继承和多态是Java面向对象的三大核心特性。
- 封装:隐藏对象的属性和实现细节,仅对外提供公共访问方式。通过private修饰符和getter/setter方法实现,提高代码的安全性和复用性。
- 继承:子类自动共享父类的数据和方法,扩展已有类的功能。Java中只支持单继承,但可以通过接口实现多继承的效果。
- 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。多态的实现条件包括继承、方法重写和父类引用指向子类对象。
2. String、StringBuilder、StringBuffer 的区别?
这是Java 100 道面试题中极高频的基础题。主要区别在于可变性和线程安全性:
| 特性 | String | StringBuilder | StringBuffer |
|---|---|---|---|
| 可变性 | 不可变 | 可变 | 可变 |
| 线程安全 | 安全(常量池) | 不安全 | 安全(synchronized) |
| 性能 | 一般 | 最高 | 较低 |
在实际开发中,如果涉及大量字符串拼接且不在多线程环境下,优先使用StringBuilder以提升性能。
3. HashMap 与 Hashtable 的区别?
HashMap不是线程安全的,允许key或value为null,底层基于数组+链表+红黑树实现(JDK1.8+)。而Hashtable是线程安全的(方法加synchronized),不允许null值,效率较低,现已不推荐使用,推荐使用ConcurrentHashMap。
Java 100 道面试题 - 并发与JVM篇
深入理解并发编程和JVM内存模型,是区分初级与高级Java工程师的关键。本章节涵盖了多线程、线程池及垃圾回收等核心考点。
⚙️ 线程池核心参数
创建线程池时,必须明确7大核心参数:corePoolSize(核心线程数)、maximumPoolSize(最大线程数)、keepAliveTime(空闲存活时间)、unit(时间单位)、workQueue(任务队列)、threadFactory(线程工厂)、handler(拒绝策略)。
⚙️ JVM 内存区域划分
JVM内存主要分为堆内存(Heap)和非堆内存(Non-Heap)。堆内存存储对象实例,分为新生代(Young Gen)和老年代(Old Gen)。非堆内存存储类信息、常量、静态变量等。
⚙️ volatile 关键字
volatile保证了变量的可见性和有序性,但不保证原子性。它禁止指令重排序,常用于单例模式的双重检查锁定(DCL)中。
JVM 垃圾回收算法详解
常见的垃圾回收算法包括标记-清除(Mark-Sweep)、复制(Copying)、标记-整理(Mark-Compact)和分代收集(Generational Collection)。现代JVM通常结合使用这些算法,例如新生代采用复制算法,老年代采用标记-整理算法。
// 示例:简单的线程池使用
ExecutorService executor = new ThreadPoolExecutor(
5, 10, 60L, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(100),
new ThreadPoolExecutor.CallerRunsPolicy()
);
Java 100 道面试题 - 框架与中间件篇
Spring生态和消息队列是Java后端开发的标配。面试官常问Spring Bean生命周期、AOP原理以及RabbitMQ/Kafka的使用场景。
Spring Bean 的生命周期
Spring Bean的生命周期非常复杂,主要步骤包括:
- 实例化(Instantiation):Spring容器通过构造器或工厂方法创建Bean实例。
- 属性赋值(Populate Bean):填充Bean的属性,完成依赖注入。
- 初始化(Initialization):如果Bean实现了InitializingBean接口,调用afterPropertiesSet方法;或者执行自定义的init-method。
- 销毁(Destruction):当容器关闭时,如果Bean实现了DisposableBean接口,调用destroy方法。
Redis 常见数据结构与应用
Redis不仅是简单的Key-Value存储,它提供了String、List、Set、ZSet、Hash五种数据结构。在Java 100 道面试题中,Redis的高可用架构(哨兵、集群)也是考察重点。
- String:用于缓存、计数器、分布式锁。
- Hash:存储对象信息,如用户资料。
- ZSet:排行榜、延迟队列。
Java 100 道面试题 - 数据库篇
MySQL是Java后端最常用的关系型数据库。索引优化、事务隔离级别、MVCC机制是面试的重灾区。
MySQL InnoDB引擎主要使用B+树作为索引结构。B+树相比B树,非叶子节点不存储数据,只存储键值,从而能容纳更多的索引项,降低树的高度,减少IO次数。所有数据都存储在叶子节点,且叶子节点之间有指针相连,适合范围查询。
SQL标准定义了四种隔离级别:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。MySQL默认级别为可重复读,通过MVCC(多版本并发控制)和锁机制解决了脏读和不可重复读问题,一定程度上解决了幻读。
1. 避免使用SELECT ,只查询需要的字段。
2. 利用覆盖索引减少回表。
3. 避免在索引列上进行计算或函数操作。
4. 使用EXPLAIN分析执行计划,关注type、key、rows等字段。
Java 100 道面试题 - 微服务架构篇
随着Spring Cloud和Dubbo的普及,微服务架构已成为中大型项目的主流。分布式事务、服务治理、网关限流是核心考点。
分布式事务解决方案
在微服务架构下,跨服务的数据一致性难以保证。常见的解决方案包括:
- 2PC(两阶段提交):强一致性,但性能较差,存在单点故障风险。
- TCC(尝试-确认-取消):应用层实现的补偿事务,性能较好,但代码侵入性强。
- 本地消息表/MQ事务消息:最终一致性方案,通过消息队列保证最终数据一致,是目前互联网大厂常用的方案。