Java面试教程:从基础到进阶全攻略
第一章:Java基础面试题
1.1 面向对象编程(OOP)
Q1: 什么是面向对象编程?它的三大特性是什么?
-
面向对象编程是一种编程范式,以"对象"为中心组织代码
-
三大特性:
- 封装:隐藏内部实现细节,提供公共接口
- 继承:子类继承父类属性和方法
- 多态:同一方法在不同上下文中有不同表现
Q2: 重载(Overload)和重写(Override)的区别?
- 重载:同一类中方法名相同,参数列表不同(类型、数量、顺序)
- 重写:子类重写父类方法,方法名、参数列表必须相同,返回类型可以相同或协变
1.2 基础语法
Q3: final, finally, finalize的区别?
- final:修饰类(不可继承)、方法(不可重写)、变量(不可修改)
- finally:与try-catch配合使用,确保代码块一定执行
- finalize:Object类方法,垃圾回收前调用(不推荐使用)
Q4: ==和equals()的区别?
- ==:比较基本类型值或对象引用地址
- equals():Object类方法,默认比较引用,可重写为比较内容(如String类)
第二章:Java核心类库
2.1 集合框架
Q5: ArrayList和LinkedList的区别?
- ArrayList:基于动态数组,随机访问快,插入删除慢(中间位置)
- LinkedList:基于双向链表,随机访问慢,插入删除快
Q6: HashMap实现原理及1.7与1.8的区别?
-
实现原理:数组+链表(1.7),数组+链表+红黑树(1.8,链表长度>8时转红黑树)
-
1.8优化:
- 扩容时链表元素逆序插入减少死循环
- 引入红黑树提高查询效率
2.2 并发编程
Q7: synchronized和ReentrantLock的区别?
- synchronized:关键字,自动释放锁,不可中断
- ReentrantLock:API实现,可中断、可超时、可公平锁
Q8: 线程池参数及拒绝策略?
java
ThreadPoolExecutor(
int corePoolSize, // 核心线程数
int maximumPoolSize, // 最大线程数
long keepAliveTime, // 空闲线程存活时间
TimeUnit unit, // 时间单位
BlockingQueue<Runnable> workQueue, // 任务队列
ThreadFactory threadFactory, // 线程工厂
RejectedExecutionHandler handler // 拒绝策略
)
-
拒绝策略:
- AbortPolicy:直接抛出异常(默认)
- CallerRunsPolicy:由调用线程执行任务
- DiscardPolicy:直接丢弃任务
- DiscardOldestPolicy:丢弃队列最老任务
第三章:JVM相关
3.1 内存模型
Q9: JVM内存结构?
- 程序计数器:线程私有,记录当前执行指令地址
- 虚拟机栈:线程私有,存储局部变量表、操作数栈等
- 本地方法栈:线程私有,为Native方法服务
- 堆:线程共享,存储对象实例
- 方法区:线程共享,存储类信息、常量、静态变量等(1.8后为元空间)
Q10: 垃圾回收算法?
- 标记-清除:产生内存碎片
- 复制算法:适用于新生代(Eden:Survivor=8:1:1)
- 标记-整理:适用于老年代
- 分代收集:新生代用复制,老年代用标记-整理
3.2 类加载机制
Q11: 类加载过程?
- 加载:查找并加载类的二进制数据
- 验证:确保类文件格式正确
- 准备:为静态变量分配内存并赋默认值
- 解析:将符号引用转为直接引用
- 初始化:执行静态代码块和静态变量赋值
Q12: 双亲委派模型?
- 加载类时,先委托父类加载器加载,父类无法加载再由自己加载
- 防止核心类被篡改(如自己写java.lang.String类不会被加载)
第四章:设计模式
4.1 常见设计模式
Q13: 单例模式的几种实现方式?
- 饿汉式:
java
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton(){}
public static Singleton getInstance() { return INSTANCE; }
}
- 双重检查锁(DCL):
java
public class Singleton {
private volatile static Singleton instance;
private Singleton(){}
public static Singleton getInstance() {
if(instance == null) {
synchronized(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
- 静态内部类:
java
public class Singleton {
private Singleton(){}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
4.2 设计原则
Q14: SOLID原则是什么?
- SRP:单一职责原则
- OCP:开闭原则(对扩展开放,对修改关闭)
- LSP:里氏替换原则
- ISP:接口隔离原则
- DIP:依赖倒置原则
第五章:数据库与框架
5.1 SQL优化
Q15: SQL优化策略?
- 避免SELECT *,只查询需要的列
- 合理使用索引(避免索引失效)
- 使用explain分析SQL执行计划
- 避免使用子查询,改用JOIN
- 分页查询优化(避免大偏移量)
5.2 Spring相关
Q16: Spring Bean的生命周期?
- 实例化Bean
- 填充属性(依赖注入)
- BeanNameAware的setBeanName()
- BeanFactoryAware的setBeanFactory()
- ApplicationContextAware的setApplicationContext()
- BeanPostProcessor的postProcessBeforeInitialization()
- InitializingBean的afterPropertiesSet()
- 自定义init-method
- BeanPostProcessor的postProcessAfterInitialization()
- 使用中
- DisposableBean的destroy()
- 自定义destroy-method
Q17: Spring AOP实现原理?
-
基于动态代理:
- JDK动态代理(接口代理)
- CGLIB代理(子类代理)
-
底层使用AspectJ的注解和切点表达式
第六章:高级特性与新特性
6.1 Java 8新特性
Q18: Lambda表达式和函数式接口?
java
// 函数式接口示例
@FunctionalInterface
interface GreetingService {
void sayMessage(String message);
}
// Lambda表达式
GreetingService greetService = message -> System.out.println("Hello " + message);
Q19: Stream API操作?
java
List<String> filtered = list.stream()
.filter(s -> s.startsWith("A"))
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());
6.2 NIO与并发工具
Q20: NIO与BIO的区别?
- BIO:同步阻塞IO,一个连接一个线程
- NIO:同步非阻塞IO,基于Channel和Buffer,使用Selector多路复用
Q21: CountDownLatch和CyclicBarrier的区别?
- CountDownLatch:一个线程等待其他线程完成
- CyclicBarrier:多个线程互相等待,达到共同点后继续执行
第七章:面试技巧与常见问题
7.1 面试准备
Q22: 如何准备Java面试?
- 复习基础知识,构建知识体系
- 刷题(LeetCode、牛客网等)
- 准备项目经验介绍(STAR法则)
- 模拟面试,练习表达
7.2 常见问题
Q23: 你最大的优点和缺点是什么?
- 优点:结合技术特点(如学习能力强、注重细节)
- 缺点:避免致命缺点(如"我工作太拼命"),可以说"有时过于追求完美"
Q24: 职业规划是什么?
- 短期:深入技术领域,成为专家
- 中期:提升系统设计能力,带团队
- 长期:技术管理双通道发展
附录:推荐学习资源
-
书籍:
- 《Effective Java》
- 《Java并发编程实战》
- 《深入理解Java虚拟机》
-
在线课程:
- 慕课网Java系列课程
- Coursera Java专项课程
-
刷题平台:
- LeetCode
- 牛客网
- HackerRank
-
官方文档:
- Oracle Java文档
- Spring官方文档
面试小贴士:
- 回答问题时遵循"结论先行"原则
- 不懂的问题不要强行回答,可以表示会后续学习
- 展示你的思考过程比给出正确答案更重要
- 准备一些有深度的问题反问面试官
希望这份教程能帮助您系统准备Java面试,祝您面试成功!