一、Java基础数据类型与核心概念
1. 八大基础数据类型及其包装类
- 基础类型:
byte、short、int、long、float、double、char、boolean。 - 包装类:
Byte、Short、Integer、Long、Float、Double、Character、Boolean。 - 区别:基础类型直接存值于栈中,包装类是对象(堆内存),支持
null和额外方法(如类型转换)。 - 应用场景:集合框架(如
HashMap)要求对象类型,需用包装类;性能敏感场景优先用基础类型。
2. Java三大特性
- 封装
- 实现:通过
private修饰属性,提供getter/setter方法。例如BankAccount类隐藏balance字段。 - 场景:保护敏感数据(如密码)、控制数据有效性(如金额非负)。
- 实现:通过
- 继承
- 实现:
extends关键字,子类复用父类方法/属性。例如Dog继承Animal并重写makeSound()。 - 场景:代码复用(如UI组件复用)、多态基础。
- 实现:
- 多态
- 实现:方法重写(
@Override)、接口实现。例如父类引用指向子类对象Animal animal = new Dog()。 - 场景:动态行为(如策略模式)、接口统一(如
List与ArrayList/LinkedList)。
- 实现:方法重写(
3. 重载(Overload)与重写(Override)
- 区别
重载 重写 同一类中,方法名相同、参数列表不同 子类覆盖父类方法,需相同签名 编译时多态 运行时多态 返回类型可不同 访问权限不能比父类严格 示例: setRadius(float)与setRadius(int)示例: Dog重写Animal的makeSound() - 应用场景:重载用于方法多样性(如不同参数类型),重写用于扩展行为(如子类特有逻辑)。
4. 访问修饰符作用范围
| 修饰符 | 作用范围 |
|---|---|
public |
全局可见(跨包、跨类) |
protected |
同包+子类(跨包子类) |
private |
仅当前类 |
| 默认(包私有) | 同包内 |
- 场景:
private保护核心算法,protected允许子类扩展,public暴露API。
5. ==与equals()
- 区别
==equals()基础类型比值,对象比内存地址 对象内容比较(需重写) 默认行为( Object中==比较地址)默认与 ==一致,但可重写(如String) - 正确使用:基础类型用
==,对象优先用equals(),避免直接==比较对象(除非确定同一实例)。
6. hashCode()相同,equals()是否一定为true?
- 答案:否。哈希冲突可能导致不同对象
hashCode()相同,但equals()返回false。例如,仅按部分字段生成hashCode()时。 - 示例:
Person类hashCode()仅用年龄,但equals()比较姓名和年龄。
7. 重写equals()必须重写hashCode()的原因
- 一致性要求:Java规范规定,若
a.equals(b)为true,则a.hashCode()必须等于b.hashCode()。否则,哈希表(如HashMap)无法正确存储/检索对象。 - 场景:自定义对象需存入集合时,必须保证
equals和hashCode逻辑一致。
8. short s = 1; s = s + 1;与s++的区别
- 区别:
s + 1:1是int,运算结果为int,需强制转换(s = (short)(s + 1))。s++:自动类型转换,等价于s += 1。
- 错误示例:
s = s + 1会编译失败,而s += 1合法。
9. 浅拷贝与深拷贝
- 区别
浅拷贝 深拷贝 仅复制对象引用 递归复制所有嵌套对象 修改引用字段影响原对象 完全独立 - 实现:
- 浅拷贝:
Clone()方法默认实现(如Person.clone())。 - 深拷贝:重写
clone()递归复制,或通过序列化/反序列化。
- 浅拷贝:
- 场景:浅拷贝用于简单对象,深拷贝用于含复杂引用(如
Address字段)。
10. 线程安全单例模式
- 实现方式
- 饿汉式:类加载时初始化,线程安全但浪费资源。
- 双重检查锁:
private volatile Singleton instance;+ 同步块。 - 静态内部类:延迟加载,线程安全(如
DoubleCheckedLockSingleton)。 - 枚举:天然线程安全,防反射破坏。
- 场景:资源池(如数据库连接)、配置中心。
11. final、finally、finalize
- 区别
finalfinallyfinalize修饰不可变类/方法/变量 try块后必执行代码Object方法,GC前调用(已过时)示例: final String NAME = "常量"示例:关闭资源(如 IO流)建议用 try-with-resources替代。 - 场景:
final定义常量,finally释放资源,finalize避免使用。
12. JVM内存区域
| 区域 | 作用 | 示例 |
|---|---|---|
| 程序计数器 | 记录当前线程执行位置 | 多线程切换时恢复执行 |
| Java堆 | 存储对象实例 | new Object() |
| 方法区 | 存储类元数据、常量池 | static变量、String.intern() |
| 虚拟机栈 | 方法调用栈帧 | 局部变量表、操作数栈 |
13. 类加载机制
- 双亲委派模型:类加载器优先委派给父类加载,最后由子类加载器加载(如
AppClassLoader加载应用类)。 - 类加载器类型:
- 启动类加载器(
BootstrapClassLoader):加载rt.jar。 - 扩展类加载器(
ExtensionClassLoader):加载ext目录。 - 应用类加载器(
AppClassLoader):加载CLASSPATH。
- 启动类加载器(
- 场景:热部署(自定义类加载器)、插件化架构。
14. 反射机制
- 定义:运行时动态获取类信息、调用方法/构造器。核心类:
Class、Method、Field。 - 应用:
- 框架(如
Spring依赖注入)。 - 动态代理(如
JDK Proxy)。 - 反序列化(通过
Class.forName())。
- 框架(如
- 性能:反射比
new慢10倍以上,建议缓存Class对象。
15. 多态实现
- 方式:
- 继承+重写:子类重写父类方法(如
Dog重写Animal的makeSound())。 - 接口:多类型实现同一接口(如
Flyable接口的Bird和Airplane)。
- 继承+重写:子类重写父类方法(如
- 动态绑定:JVM在运行时根据实际对象类型调用方法。
16. 抽象类 vs 接口
| 抽象类 | 接口 |
|---|---|
| 可含方法实现 | 仅声明方法(Java 8+允许默认方法) |
| 单继承 | 多实现 |
| 适合状态管理 | 适合定义规范(如Serializable) |
- 选择:
- 抽象类:代码复用(如
AbstractList提供基础实现)。 - 接口:多角色扩展(如
Robot同时实现Worker和Rechargeable)。
- 抽象类:代码复用(如
17. Error vs Exception
- 区别
Error Exception 严重系统错误(如 OOM)程序可处理的异常(如 NullPointerException)不可恢复 分为 Checked(必须处理)和Unchecked(可选处理) - 处理:
Error通常不捕获,Exception需通过try-catch或声明throws。
18. NoClassDefFoundError vs ClassNotFoundException
- 区别
NoClassDefFoundErrorClassNotFoundException类加载时初始化失败(如依赖缺失) 反射加载类时未找到类文件 Error(不可恢复)Exception(需处理) - 场景:
NoClassDefFoundError常见于动态代理或插件加载失败,ClassNotFoundException常见于反射调用错误类名。
19. try中return与finally执行顺序
- 规则:
try中return前,先执行finally,再返回结果。finally中有return会覆盖try的返回值。
- 示例:
public int test() { try { return 1; } finally { return 2; } // 最终返回2 }
20. 异常处理与自定义异常
- 机制:
try-catch-finally:捕获异常,释放资源。- 自定义异常:继承
Exception(受检)或RuntimeException(非受检)。例如:
class OrderException extends Exception { // 业务异常 public OrderException(String msg) { super(msg); } } - 场景:自定义异常区分错误类型(如
InvalidOrderStateException)。
基于原始20个问题,可以延伸出以下进阶问题(按技术领域分类),每个问题均包含核心考点和典型应用场景:
一、数据类型与类型系统扩展
- 自动装箱/拆箱的原理及陷阱
- 考点:Integer缓存机制(-128~127)、NPE风险
- 场景:高并发场景下频繁装箱的性能损耗(如阿里巴巴Java规范禁止在循环中装箱)
- 类型擦除与泛型边界
- 考点:
List<String>与List<Integer>本质相同、通配符<?>与<? extends T> - 场景:
Collections.unmodifiableList()的实现原理
- 考点:
- 数值类型优化技巧
- 考点:
byte[]替代String传输、BitSet节省内存空间 - 场景:大数据量缓存设计(如Redis键值对存储)
- 考点:
二、面向对象设计扩展
- 组合优于继承的实践案例
- 考点:Java序列化漏洞(
readObject方法)、里氏替换原则破坏 - 场景:策略模式实现支付系统(如支付宝/微信/银联支付组件)
- 考点:Java序列化漏洞(
- 多态的底层实现机制
- 考点:虚方法表(vtable)、invokevirtual指令
- 场景:JVM性能调优(如热点代码内联优化)
- 设计模式与特性关联
- 考点:装饰器模式(动态组合功能)、代理模式(Spring AOP实现)
- 场景:微服务权限控制链(RBAC模型实现)
三、内存与并发扩展
- JVM参数调优场景
- 考点:
-XX:MetaspaceSize与-XX:MaxMetaspaceSize、G1垃圾回收器参数 - 场景:Elasticsearch集群堆外内存配置
- 考点:
- 线程安全实现范式
- 考点:
AtomicInteger与LongAdder选择依据、StampedLock读写分离 - 场景:秒杀系统库存扣减(Redis+Lua vs 分布式锁)
- 考点:
- 内存模型与可见性
- 考点:
volatile三特性(可见性/禁止指令重排/不保证原子性) - 场景:双重检查锁单例的
volatile必要性
- 考点:
四、反射与元编程扩展
- 反射性能优化方案
- 考点:
MethodHandle替代传统反射、CGLIB动态代理 - 场景:MyBatis XML解析性能优化
- 考点:
- 元空间(Metaspace)溢出排查
- 考点:类加载链分析(
-XX:+TraceClassLoading)、动态代理类膨胀 - 场景:Dubbo SPI扩展机制导致的内存泄漏
- 考点:类加载链分析(
- JDK动态代理原理
- 考点:
InvocationHandler调用链、Proxy类生成逻辑 - 场景:Spring事务管理的AOP实现
- 考点:
五、集合框架扩展
- HashMap源码级解析
- 考点:红黑树阈值(8/64)、ConcurrentHashMap分段锁演进
- 场景:线程安全Map选择(Collections.synchronizedMap vs ConcurrentHashMap)
- 队列实现对比
- 考点:
ArrayBlockingQueue数组实现 vsLinkedBlockingQueue链表实现 - 场景:Kafka消息队列的环形缓冲区设计
- 考点:
- 自定义集合实现
- 考点:
Comparable与Comparator区别、TreeSet红黑树维护 - 场景:订单系统按创建时间排序展示
- 考点:
六、异常体系扩展
- Checked/Unchecked异常设计哲学
- 考点:RuntimeException的传播特性、
@ControllerAdvice全局处理 - 场景:REST API统一错误码返回(如HTTP 400/500)
- 考点:RuntimeException的传播特性、
- OOM异常细分类型
- 考点:
java.lang.OutOfMemoryError: GC overhead limit exceeded - 场景:Full GC频繁导致的响应时间抖动排查
- 考点:
- 异常链机制
- 考点:
initCause()方法、Exception构造函数参数 - 场景:分布式链路追踪(如SkyWalking异常堆栈透传)
- 考点:
七、JVM高级特性
- 类加载器双亲委派破坏场景
- 考点:Tomcat多Context类隔离、spi机制(
java.util.ServiceLoader) - 场景:Kafka多版本共存部署
- 考点:Tomcat多Context类隔离、spi机制(
- JIT编译优化策略
- 考点:热点代码探测(Counter/Timer)、方法内联阈值
- 场景:高并发服务性能调优(如支付宝交易链路)
- GC算法对比实践
- 考点:CMS并发收集停顿时间 vs G1预测停顿
- 场景:JVM监控工具选择(VisualVM vs Arthas)
八、生态工具扩展
- AOP实现原理对比
- 考点:AspectJ编译时织入 vs Spring运行时代理
- 场景:Spring Boot Actuator监控指标采集
- 字节码增强工具对比
- 考点:Javassist动态修改字节码 vs ASM底层操作
- 场景:MyBatis XML映射文件编译过程
- JVM监控体系构建
- 考点:JMX远程监控、
jstack线程dump分析 - 场景:生产环境Full GC根因分析(如大对象堆积)
- 考点:JMX远程监控、
扩展问题应用场景矩阵
| 技术领域 | 企业级应用场景 | 性能指标影响 | 常见问题类型 |
|---|---|---|---|
| 反射机制 | ORM框架动态SQL生成 | CPU占用率↑10-20% | 堆栈溢出(StackOverflow) |
| 并发编程 | 分布式锁实现 | 响应时间P99↑500ms | 死锁、活锁 |
| JVM调优 | 大数据ETL任务 | GC时间占比从40%→15% | OOM、频繁Full GC |
| 设计模式 | 微服务网关路由策略 | QPS提升3倍 | 版本兼容性问题 |
| 集合框架 | 缓存系统设计 | 内存占用减少30% | 并发修改异常(ConcurrentModificationException) |