1. 面向对象特性详解
封装、继承、多态是面向对象的三大特性。其中,多态是面试中最爱考察的点。多态的前提是继承或接口实现,父类引用指向子类对象。编译时看左边,运行时看右边。理解多态的关键在于方法的重写(Override)与重载(Overload)的区别。
在当前的互联网招聘市场中,Java面试常问问题始终是求职者面临的巨大挑战。无论是初级开发还是资深架构师,面试官考察的重点往往不仅仅在于API的调用,更在于对底层原理的理解、系统设计的能力以及对新技术的敏感度。本页面旨在通过详实的文案、丰富的示例和逻辑清晰的结构,为您梳理Java面试常问问题的核心脉络,帮助您构建完整的技术知识体系。
许多开发者在日常工作中可能只接触了技术的冰山一角。然而,Java面试常问问题往往侧重于那些容易被忽视的细节。例如,为什么HashMap在JDK1.8后引入了红黑树?Spring Boot自动装配的底层机制是什么?这些问题构成了区分普通程序员与优秀工程师的分水岭。通过本指南,您将不仅知道“是什么”,更理解“为什么”。
基础是Java开发的基石。在探讨高级框架之前,我们必须深入理解Java语言本身的特性。以下是几个高频出现的Java面试常问问题。
封装、继承、多态是面向对象的三大特性。其中,多态是面试中最爱考察的点。多态的前提是继承或接口实现,父类引用指向子类对象。编译时看左边,运行时看右边。理解多态的关键在于方法的重写(Override)与重载(Overload)的区别。
String是不可变的,每次修改都会产生新对象,适合少量字符串操作。StringBuilder是非线程安全的,但速度最快;StringBuffer是线程安全的,但性能稍慢。在循环拼接字符串时,务必使用StringBuilder以避免内存溢出。
抽象类是对事物的抽象,支持状态(成员变量)和行为;接口是对行为的抽象,只定义规范。在JDK8之前,接口不能有实现方法;JDK8后引入了default方法,JDK9后引入了private方法。设计时,优先考虑接口,体现“能做什么”而非“是什么”。
public class Animal {
public void eat() {
System.out.println("动物进食");
}
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}
// 测试类
Animal a = new Dog(); // 父类引用指向子类对象
a.eat(); // 输出:狗吃骨头 (运行时多态)
集合框架是Java API中最重要的部分之一。在Java面试常问问题中,集合相关的题目占据了相当大的比例。理解List、Set、Map的实现原理及适用场景至关重要。
ArrayList基于动态数组实现,支持随机访问,查询速度快(O(1)),但插入和删除速度慢(需要移动元素)。其默认初始容量为10,当容量不足时,会扩容为原来的1.5倍(旧容量 + 旧容量/2)。
HashMap基于哈希表实现,存储键值对。在JDK1.7中,由数组+链表组成;在JDK1.8中,引入了红黑树,当链表长度超过8且数组长度超过64时,链表转换为红黑树,将查找复杂度从O(n)降低到O(log n)。
核心知识点:
ConcurrentHashMap在JDK1.7中使用分段锁(Segment),在JDK1.8中使用了CAS+synchronized来保证线程安全。相比Hashtable和Collections.synchronizedMap,其并发性能有了质的飞跃。
它通过定位Hash桶的索引,只对发生冲突的桶进行锁定,从而大大减少了锁的竞争。
随着多核CPU的普及,并发编程已成为Java后端开发的必修课。Java面试常问问题中,关于线程、锁、线程池的问题层出不穷。
创建线程池推荐使用ThreadPoolExecutor,其主要参数包括:
| 参数名 | 说明 |
|---|---|
| corePoolSize | 核心线程数,线程池中长期存活的线程数。 |
| maximumPoolSize | 最大线程数,允许创建的最大线程数。 |
| keepAliveTime | 空闲线程存活时间,超过此时间的非核心线程会被回收。 |
| workQueue | 任务队列,用于存放等待执行的任务(如ArrayBlockingQueue)。 |
| threadFactory | 线程工厂,用于创建新线程,可自定义线程名。 |
在Java中,锁是实现同步的关键。常见的锁包括:
JVM(Java Virtual Machine)是Java跨平台的基石。在高级别面试中,Java面试常问问题往往会深入到内存模型和垃圾回收算法。
JVM内存主要分为堆(Heap)和栈(Stack),此外还有方法区、程序计数器和本地方法栈。
最基础的算法,先标记所有需要回收的对象,然后统一清除。缺点是会产生物件碎片。
将内存分为两块,每次只用一块,回收时将存活的对象复制到另一块。常用于新生代。
标记后让所有存活对象向一端移动,然后清理边界外的内存。常用于老年代。
Spring框架是Java后端开发的绝对主力。理解Spring的核心机制是应对Java面试常问问题的关键。
控制反转(IOC):将对象的创建权交给Spring容器,降低了模块间的耦合度。
依赖注入(DI):Spring容器在运行时动态地将依赖对象注入到组件中。常见的注入方式有构造函数注入、Setter注入和字段注入(@Autowired)。
面向切面编程(AOP):将日志记录、性能统计、事务处理等横切关注点与业务逻辑分离。Spring AOP基于动态代理实现:如果目标对象实现了接口,使用JDK动态代理;否则使用CGLIB。
Bean的生命周期非常复杂,主要包括:实例化 -> 属性赋值 -> 初始化(@PostConstruct, InitializingBean) -> 销毁(@PreDestroy, DisposableBean)。理解这一流程有助于解决复杂的初始化问题。
数据存储是后端系统的核心。MySQL的事务隔离级别和Redis的持久化机制是面试的热点。
SQL标准定义了四种隔离级别:
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| 读未提交 (Read Uncommitted) | 有可能 | 有可能 | 有可能 |
| 读已提交 (Read Committed) | 不可能 | 有可能 | 有可能 |
| 可重复读 (Repeatable Read) | 不可能 | 不可能 | 有可能 |
| 串行化 (Serializable) | 不可能 | 不可能 | 不可能 |
Redis提供两种持久化方式:
随着业务规模的扩大,单体应用逐渐向微服务架构转型。Spring Cloud是Java微服务的事实标准。
在分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)三者不可兼得。微服务架构通常追求AP或CP,而BASE理论是对CAP中AP的延伸,强调基本可用、软状态和最终一致性。