Java 面试题›Java 基础面试题›什么是 UUID,能保证唯一性吗?
面试考察点
概念理解:面试官不仅仅是想知道 UUID 是 “一串随机字符”,更是想考察你是否理解 UUID 的结构组成和生成算法。
唯一性认知:UUID 的 “唯一性” 是理论上的还是绝对的?这涉及概率论和分布式系统的核心概念。
方案选型:在实际项目中,UUID 是否是最佳选择?考察你是否了解其他分布式 ID 生成方案(雪花算法、数据库自增等)。
核心答案UUID(Universally Unique Identifier)是通用唯一识别码,一个 128 位的标识符,通常表示为 36 个字符的字符串(32 个十六进制数 + 4 个连字符)。理论上可以保证唯一性,但不是 100% 绝对不重复。
维度
说明
长度
128 位(16 字节)
字符串形式
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(36 字符)
示例
550e8400-e29b-41d4-a716-446655440000
唯一性
理论唯一,实际有极小概率冲突(约 2^122 分之一)
Ja ...
Java 面试题›Java 基础面试题›为什么重写 equals 时一定要重写 hashCode?
面试考察点
契约理解:面试官不仅仅是想知道 “要一起重写”,更是想考察你是否理解 equals() 和 hashCode() 之间的隐式契约——相等对象必须有相等的哈希码。
集合框架原理:这个问题通常和 HashMap、HashSet 的工作原理绑定考察,看你是否理解哈希表如何利用这两个方法进行元素的存储和查找。
实战踩坑:只重写 equals() 不重写 hashCode() 是 Java 开发中最常见的 bug 之一,考察你是否在生产环境踩过坑。
核心答案Java 规定:如果两个对象 equals() 返回 true,那么它们的 hashCode() 必须返回相同的值。只重写 equals() 不重写 hashCode() 会违反这个契约,导致 HashMap、HashSet 等哈希集合工作异常。 ****
场景
equals()
hashCode()
结果
都不重写
比较地址
基于地址
✅ 符合契约
只重写 equals
...
Java 面试题›Java 基础面试题›什么是序列化与反序列化?
面试考察点
概念理解:面试官不仅仅是想知道 “对象变字节、字节变对象” 这个定义,更是想考察你是否理解序列化的本质——将内存中的对象状态转换为可存储/可传输的格式。
实践应用:序列化在实际开发中无处不在(RPC 调用、缓存存储、消息队列、深拷贝等),考察你是否知道何时需要序列化,以及如何选择合适的序列化方案。
安全意识:Java 原生序列化存在安全漏洞(反序列化攻击),考察你是否了解这些风险以及如何在生产环境中规避。
核心答案序列化是将 Java 对象转换为字节序列的过程,便于存储到文件、数据库或进行网络传输;反序列化是将字节序列恢复为 Java 对象的过程。
操作
输入
输出
典型场景
序列化
Java 对象
字节序列
存储到磁盘、网络传输、分布式调用
反序列化
字节序列
Java 对象
从磁盘读取、接收网络数据、RPC 响应
一句话理解:序列化让对象 “离开 JVM”(持久化/传输),反序列化让对象 “回到 JVM”(恢复使用)。
深度解析一、序列化与反序列化流程
fl ...
Java 面试题›Java 基础面试题›深拷贝和浅拷贝的区别?
面试考察点
基础概念理解:面试官不仅仅是想知道 “一个是复制引用,一个是复制对象”,更是想考察你是否理解 Java 对象在内存中的存储结构,以及引用类型和基本类型的区别。
实现方式掌握:考察你是否知道如何实现深拷贝(Cloneable、序列化、第三方工具),以及各种方式的优缺点。
实战经验:实际开发中何时需要深拷贝?哪些场景下浅拷贝会导致 bug?这反映你的工程经验。
核心答案浅拷贝只复制对象本身,内部的引用类型成员变量仍然指向原对象;深拷贝会递归复制所有层级的对象,创建完全独立的新对象。
对比维度
浅拷贝
深拷贝
对象本身
✅ 复制
✅ 复制
基本类型成员
✅ 复制值
✅ 复制值
引用类型成员
❌ 只复制引用(共享)
✅ 递归复制对象
修改影响
修改引用成员会影响原对象
完全独立,互不影响
实现复杂度
简单(clone())
复杂(递归/序列化/工具)
深度解析一、内存结构对比图
flowchart TB
subgraph SHALLOW["浅 ...
Java 面试题›Java 基础面试题›为什么不能用浮点数表示金额?
面试考察点
基础理解深度:面试官不仅仅是想知道 “不能用”,更是想考察你是否理解浮点数在计算机中的存储原理(IEEE 754 标准),以及为什么会产生精度丢失。
实战经验:金额计算是金融系统的核心场景,考察你是否在生产环境中踩过坑,是否知道正确的解决方案。
知识广度:从浮点数精度问题延伸到 BigDecimal 的使用、数据库字段选择(DECIMAL vs DOUBLE)、分布式场景下的金额处理等。
核心答案浮点数(float/double)不能用于金额计算,核心原因是 IEEE 754 标准的二进制浮点数无法精确表示某些十进制小数,会导致精度丢失和累计误差。 ****
数据类型
存储方式
精度问题
金额场景
float
32 位 IEEE 754
约 7 位有效数字
❌ 禁止使用
double
64 位 IEEE 754
约 15 位有效数字
❌ 禁止使用
BigDecimal
十进制整数 + 标度
任意精度
✅ 推荐
lon ...
Java 面试题›Java 基础面试题›什么是 SPI,和 API 有什么区别?
面试考察点
设计模式理解:面试官不仅仅是想知道 “SPI 是服务发现机制” 这种定义,更是想考察你是否理解 SPI 背后的设计思想——开闭原则、解耦、可扩展性,以及它与工厂模式、策略模式的关系。
框架扩展能力:考察你是否清楚 SPI 在主流框架(Spring、Dubbo、JDBC、SLF4J)中的应用,能否利用 SPI 机制实现框架的灵活扩展。
实践踩坑经验:看你是否在实际项目中使用过 SPI,是否了解 SPI 的类加载机制、配置规范、性能问题,以及如何避免 ServiceLoader 的陷阱。
核心答案SPI(Service Provider Interface)是 Java 提供的一种 服务发现机制,允许程序在运行时动态加载接口的实现类,实现接口与实现的解耦。 **** **** **** **** **** **** ****
对比维度
API
SPI
全称
Application Programming Inter ...
Java 面试题›Java 基础面试题›AIO、BIO 和 NIO 的区别?
面试考察点
IO 模型理解深度:面试官不仅仅是想知道 “BIO 阻塞、NIO 非阻塞” 这种浅层答案,更是想考察你是否理解同步/异步、阻塞/非阻塞的本质区别,以及三种 IO 模型在操作系统层面的实现原理。
架构设计能力:考察你是否清楚不同 IO 模型的适用场景,能否根据业务特点(连接数、数据量、实时性)选择合适的模型,理解 Netty、Tomcat 等框架为何选择 NIO。
实践经验:看你是否在实际项目中使用过 NIO/AIO,是否了解 Reactor 模式、Proactor 模式,以及如何解决 IO 模型带来的性能瓶颈。
核心答案BIO、NIO、AIO 是 Java 的三种 IO 模型,核心区别在于 阻塞方式 和 线程模型: **** **** **** **** **** **** **** **** **** **** ****
对比维度
BIO
NIO
...
Java 面试题›Java 基础面试题›BigDecimal 和 Long 哪个表示金额更合适,怎么选择?
面试考察点
浮点数精度问题理解:面试官不仅仅是想知道你 “用 BigDecimal”,更是想考察你是否理解为什么 float/double 不能用于金额计算,以及浮点数精度丢失的根本原因。
技术选型能力:考察你是否了解 BigDecimal 和 Long 各自的优缺点,能否根据业务场景(精度要求、性能要求、代码复杂度)做出合理选择。
生产实践经验:看你是否在实际项目中处理过金额相关的需求,是否踩过坑(如数据库字段类型选择、前后端交互、并发计算等)。
核心答案结论:没有绝对的优劣,需要根据场景选择。 ****
类型
推荐场景
核心优势
主要劣势
BigDecimal
复杂金融计算、需要小数精度
精度无损失、API 丰富
性能较差、代码繁琐
Long(分存储)
简单场景、高并发、性能敏感
性能高、计算简单、无精度问题
需要手动转换单位、API 不直观
double/float
❌ 禁止用于金额 ...
Java 面试题›Java 基础面试题›finally 中代码一定会被执行吗?
面试考察点
异常处理机制理解:面试官不仅仅是想知道 “会” 或 “不会”,更是想考察你对 Java 异常处理机制的深入理解,包括 try-catch-finally 的执行流程和字节码层面的实现。
边界情况掌握:考察你是否了解 finally 不执行的特殊场景,如 System.exit()、线程异常终止等,这是区分 “会用” 和 “精通” 的关键点。
代码执行顺序理解:看你是否清楚 finally 与 return 语句的执行顺序,以及 finally 中修改返回值的影响,这是常见的面试陷阱。
核心答案答案是:不一定。finally 中的代码在 绝大多数情况下 会执行,但存在 特殊情况 会导致 finally 不执行。 **** **** ****
场景分类
finally 是否执行
说明
正常执行完 try
✅ 执行
最常见情况
try 中抛出异常
✅ 执行
catch 处理后执行 finally
tr ...
Java 面试题›Java 基础面试题›final、finally、finalize 的区别?
面试考察点
基础知识全面性:面试官不仅仅是想知道你能否区分这三个长得像的关键词,更是想考察你对 Java 基础知识的掌握是否全面——从修饰符、异常处理到对象生命周期。
实践应用能力:考察你是否在实际项目中正确使用过 final(如不可变类、常量定义),是否理解 finally 在资源释放中的作用,以及是否知道 finalize() 已被废弃。
技术敏感度:看你是否关注 Java 版本演进,知道 finalize() 从 JDK 9 开始被标记为 @Deprecated,理解其被废弃的原因。
核心答案这三个词虽然名字相似,但 完全不是一类东西: ****
关键词
类型
作用
使用场景
final
关键字
修饰符,表示 “不可变”
类、方法、变量
finally
关键字
异常处理代码块
与 try-catch 配合,确保代码执行
finalize()
方法
对象回收前的回调
已废弃,不推荐使用
一句话概括:final ...
