Java面试核心知识点深度解析
interview 项目地址: https://gitcode.com/gh_mirrors/intervi/interview
本文基于Java面试题库项目,系统性地梳理了Java语言的核心面试知识点,帮助开发者全面掌握Java基础、面向对象特性、异常处理、集合框架、多线程等关键技术要点。
面向对象编程基础
面向对象四大特性
面向对象编程具有四大核心特性,理解这些特性是掌握Java的基础:
-
抽象(Abstraction)
- 数据抽象:提取对象的公共属性
- 行为抽象:定义对象的共同行为
- 关注"做什么"而非"怎么做"
-
封装(Encapsulation)
- 将数据和行为绑定为独立单元
- 通过访问控制实现信息隐藏
- 提高代码安全性和可维护性
-
继承(Inheritance)
- 子类继承父类特征和行为
- 实现代码复用和层次化设计
- Java支持单继承,通过接口实现多继承效果
-
多态(Polymorphism)
- 同一消息引发不同对象的不同响应
- 编译时多态(方法重载)
- 运行时多态(方法重写)
访问控制修饰符详解
Java提供四种访问控制级别:
| 修饰符 | 类内 | 同包 | 子类 | 任意位置 | |----------|------|------|------|---------| | private | √ | × | × | × | | 默认 | √ | √ | × | × | | protected| √ | √ | √ | × | | public | √ | √ | √ | √ |
关键点:
- 外部类只能使用public或默认修饰
- 成员内部类可以使用所有四种修饰符
- protected强调父子类关系而非包关系
Java基础数据类型与包装类
基本数据类型体系
Java的8种基本数据类型:
| 类型 | 大小 | 范围 | 默认值 | |---------|---------|--------------------------|---------| | byte | 8位 | -128~127 | 0 | | short | 16位 | -32768~32767 | 0 | | int | 32位 | -2³¹~(2³¹-1) | 0 | | long | 64位 | -2⁶³~(2⁶³-1) | 0L | | float | 32位 | IEEE754标准 | 0.0f | | double | 64位 | IEEE754标准 | 0.0d | | char | 16位 | Unicode字符(0~65535) | '\u0000'| | boolean | - | true/false | false |
包装类与自动装箱拆箱
Java为每种基本类型提供了对应的包装类:
- 自动装箱:基本类型 → 包装类(Integer.valueOf())
- 自动拆箱:包装类 → 基本类型(intValue())
缓存机制:IntegerCache缓存-128~127的Integer对象,提高性能
Integer a = 100; // 使用缓存
Integer b = 100; // 使用缓存
System.out.println(a == b); // true
Integer c = 200; // 新建对象
Integer d = 200; // 新建对象
System.out.println(c == d); // false
字符串与数组处理
String特性深度解析
-
不可变性:
- String对象一旦创建内容不可更改
- 所有修改操作都返回新String对象
- 设计考虑:安全性、线程安全、缓存hashcode
-
内存分配:
- 字符串常量池(String Pool)优化
String s = "abc"
vsString s = new String("abc")
- intern()方法手动加入常量池
-
性能优化:
- 大量字符串拼接使用StringBuilder
- 预分配大小减少扩容开销
数组关键知识点
- 数组是对象,继承自Object
- length是属性而非方法
- 多维数组实际上是数组的数组
- 数组协变:String[]是Object[]的子类型
异常处理机制
异常体系结构
Throwable
├── Error(不可恢复)
│ ├── VirtualMachineError
│ └── ...
└── Exception
├── RuntimeException(非受检异常)
└── 其他Exception(受检异常)
异常处理最佳实践
- 明确异常类型,避免捕获Throwable
- 受检异常必须处理,运行时异常酌情处理
- finally块确保资源释放
- 自定义异常应提供有意义的错误信息
- 避免在finally块中使用return
try-with-resources语法(Java7+):
try (InputStream is = new FileInputStream("file")) {
// 自动关闭资源
}
集合框架精要
核心接口关系
Collection
├── List(有序可重复)
│ ├── ArrayList
│ ├── LinkedList
│ └── Vector
├── Set(无序唯一)
│ ├── HashSet
│ └── TreeSet
└── Queue
└── Deque
Map(键值对)
├── HashMap
├── TreeMap
└── Hashtable
集合选型指南
-
List选择:
- 随机访问多 → ArrayList
- 频繁插入删除 → LinkedList
- 线程安全 → CopyOnWriteArrayList
-
Set选择:
- 一般用途 → HashSet
- 需要排序 → TreeSet
- 保持插入顺序 → LinkedHashSet
-
Map选择:
- 一般用途 → HashMap
- 需要排序 → TreeMap
- 线程安全 → ConcurrentHashMap
多线程核心概念
线程生命周期
新建(New) → 就绪(Runnable)
↔ 运行(Running)
→ 阻塞(Blocked)
→ 终止(Terminated)
线程同步机制
-
synchronized:
- 方法同步(实例方法/静态方法)
- 同步代码块(更细粒度控制)
- 可重入性
-
volatile:
- 保证可见性
- 禁止指令重排序
- 不保证原子性
-
Lock体系:
- ReentrantLock(可重入锁)
- ReadWriteLock(读写分离)
- Condition(精确控制)
线程池最佳实践
ExecutorService pool = Executors.newFixedThreadPool(5);
// 或者自定义线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize,
maximumPoolSize,
keepAliveTime,
unit,
workQueue,
threadFactory,
handler);
配置要点:
- 核心线程数 ≈ CPU核心数
- 任务队列选择(有界/无界)
- 拒绝策略(Abort/CallerRuns/Discard等)
设计模式与编码实践
常见设计模式应用
-
单例模式:
- 饿汉式(线程安全)
- 懒汉式(双重检查锁定)
- 静态内部类实现
- 枚举实现(最安全)
-
工厂模式:
- 简单工厂
- 工厂方法
- 抽象工厂
-
观察者模式:
- Java自带Observable/Observer
- 事件监听机制
高效编码技巧
-
使用位运算优化计算:
// 计算2×8 int result = 2 << 3;
-
字符串拼接优化:
StringBuilder sb = new StringBuilder(128); sb.append("a").append("b");
-
对象拷贝:
- 浅拷贝:实现Cloneable
- 深拷贝:序列化/反序列化
-
资源管理:
try (Resource res = new Resource()) { // 自动关闭 }
面试高频问题解析
经典问题深度剖析
-
equals与hashCode契约:
- 相等对象必须有相同hashCode
- 重写equals必须重写hashCode
- 不同对象hashCode可能相同(哈希碰撞)
-
final关键字作用:
- 类:不可继承
- 方法:不可重写
- 变量:不可修改
- 提高性能(内联优化)
-
抽象类vs接口:
- Java8前:接口纯抽象,抽象类可部分实现
- Java8+:接口支持默认方法
- 设计理念差异(is-a vs has-a)
-
泛型擦除机制:
- 编译时检查,运行时擦除
- 类型参数不能是基本类型
- 通配符PECS原则(Producer Extends, Consumer Super)
通过系统掌握这些核心知识点,开发者能够从容应对Java技术面试,同时也能提升日常开发中的编码质量和效率。建议结合实际编码练习,深入理解每个概念背后的设计思想和实现原理。
interview 项目地址: https://gitcode.com/gh_mirrors/intervi/interview
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考