Java面试教程:从基础到进阶全攻略

6 阅读6分钟

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: 类加载过程?

  1. 加载:查找并加载类的二进制数据
  2. 验证:确保类文件格式正确
  3. 准备:为静态变量分配内存并赋默认值
  4. 解析:将符号引用转为直接引用
  5. 初始化:执行静态代码块和静态变量赋值

Q12: 双亲委派模型?

  • 加载类时,先委托父类加载器加载,父类无法加载再由自己加载
  • 防止核心类被篡改(如自己写java.lang.String类不会被加载)

第四章:设计模式

4.1 常见设计模式

Q13: 单例模式的几种实现方式?

  1. 饿汉式:
java
public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton(){}
    public static Singleton getInstance() { return INSTANCE; }
}
  1. 双重检查锁(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;
    }
}
  1. 静态内部类:
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的生命周期?

  1. 实例化Bean
  2. 填充属性(依赖注入)
  3. BeanNameAware的setBeanName()
  4. BeanFactoryAware的setBeanFactory()
  5. ApplicationContextAware的setApplicationContext()
  6. BeanPostProcessor的postProcessBeforeInitialization()
  7. InitializingBean的afterPropertiesSet()
  8. 自定义init-method
  9. BeanPostProcessor的postProcessAfterInitialization()
  10. 使用中
  11. DisposableBean的destroy()
  12. 自定义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面试?

  1. 复习基础知识,构建知识体系
  2. 刷题(LeetCode、牛客网等)
  3. 准备项目经验介绍(STAR法则)
  4. 模拟面试,练习表达

7.2 常见问题

Q23: 你最大的优点和缺点是什么?

  • 优点:结合技术特点(如学习能力强、注重细节)
  • 缺点:避免致命缺点(如"我工作太拼命"),可以说"有时过于追求完美"

Q24: 职业规划是什么?

  • 短期:深入技术领域,成为专家
  • 中期:提升系统设计能力,带团队
  • 长期:技术管理双通道发展

附录:推荐学习资源

  1. 书籍:

    • 《Effective Java》
    • 《Java并发编程实战》
    • 《深入理解Java虚拟机》
  2. 在线课程:

    • 慕课网Java系列课程
    • Coursera Java专项课程
  3. 刷题平台:

    • LeetCode
    • 牛客网
    • HackerRank
  4. 官方文档:

    • Oracle Java文档
    • Spring官方文档

面试小贴士

  1. 回答问题时遵循"结论先行"原则
  2. 不懂的问题不要强行回答,可以表示会后续学习
  3. 展示你的思考过程比给出正确答案更重要
  4. 准备一些有深度的问题反问面试官

希望这份教程能帮助您系统准备Java面试,祝您面试成功!