1. Java复习的必要性与目标设定
作为一门已经存在超过25年的编程语言,Java至今仍保持着强大的生命力。根据最新的TIOBE指数显示,Java长期占据编程语言排行榜前三的位置。这种持久的影响力源于Java"一次编写,到处运行"的特性、丰富的生态系统以及在企业级开发中的广泛应用。
对于开发者而言,系统性地复习Java知识具有多重价值:
- 巩固基础:重新梳理Java核心概念,避免在工作中犯低级错误
- 查漏补缺:发现知识体系中的薄弱环节,特别是那些不常用但关键的特性
- 适应新版本:了解Java 8到Java 17引入的新特性,如Lambda表达式、模块系统等
- 面试准备:应对技术面试中的Java基础考察,这是大多数技术岗位的必考内容
一个完整的Java复习应该包含以下几个层次:
- 语言基础:数据类型、运算符、流程控制等
- 面向对象:类与对象、继承、多态、接口等
- 核心API:集合框架、IO/NIO、并发编程等
- JVM原理:内存模型、垃圾回收、类加载机制等
- 新特性:版本演进中的重要更新
2. Java语言基础深度梳理
2.1 数据类型与变量
Java是强类型语言,所有变量都必须先声明后使用。数据类型分为两大类:
-
基本类型:8种基本数据类型直接存储值
- 整型:byte(1)、short(2)、int(4)、long(8)
- 浮点型:float(4)、double(8)
- 字符型:char(2)
- 布尔型:boolean(理论上1bit,实际依赖JVM实现)
-
引用类型:存储对象的引用(内存地址)
- 类类型:如String、自定义类
- 接口类型
- 数组类型
java复制// 基本类型示例
int count = 10; // 直接存储值10
double price = 19.99;
// 引用类型示例
String name = "Java"; // 存储指向String对象的引用
int[] numbers = new int[5];
关键注意:基本类型在方法调用时是值传递,而引用类型是引用传递(实际也是值传递,只不过传递的是引用的拷贝)
2.2 运算符与表达式
Java运算符可分为以下几类:
- 算术运算符:+ - * / % ++ --
- 关系运算符:> < >= <= == !=
- 逻辑运算符:&& || ! ^
- 位运算符:& | ^ ~ << >> >>>
- 赋值运算符:= += -= *= /= %= &= |= ^= <<= >>= >>>=
- 条件运算符(三目):? :
- instanceof运算符:检查对象是否是特定类的实例
java复制// 运算符优先级示例
int result = 10 + 2 * 3; // 结果为16,乘法优先级高于加法
// 位运算实际应用:权限控制
final int READ = 1; // 0001
final int WRITE = 2; // 0010
final int EXECUTE = 4; // 0100
int userPermission = READ | WRITE; // 0011 (3)
boolean canWrite = (userPermission & WRITE) != 0; // true
2.3 流程控制结构
Java提供了完善的流程控制结构:
-
条件语句:
- if-else
- switch (Java 12+支持表达式形式)
-
循环语句:
- for (包括增强for循环)
- while
- do-while
-
跳转语句:
- break (带标签的break)
- continue
- return
java复制// Java 12+ switch表达式示例
String dayType = switch (day) {
case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> "Weekday";
case "Saturday", "Sunday" -> "Weekend";
default -> throw new IllegalArgumentException("Invalid day: " + day);
};
// 带标签的break
outerLoop:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (i * j > 50) break outerLoop;
}
}
3. 面向对象编程核心概念
3.1 类与对象
类是对象的模板,对象是类的实例。Java中一切皆对象(除了基本类型),但Java不是纯面向对象语言。
java复制public class Person {
// 字段(成员变量)
private String name;
private int age;
// 构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 方法
public void introduce() {
System.out.println("Hello, I'm " + name);
}
// Getter/Setter
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
3.2 继承与多态
继承是OOP的三大特性之一(封装、继承、多态),Java使用extends关键字实现单继承。
java复制public class Employee extends Person {
private String department;
public Employee(String name, int age, String dept) {
super(name, age); // 调用父类构造器
this.department = dept;
}
@Override // 方法重写
public void introduce() {
super.introduce();
System.out.println("I work in " + department);
}
}
多态的实现方式:
- 方法重写(Override)
- 接口实现
- 抽象类和抽象方法
设计原则:优先使用组合而非继承。继承会破坏封装性,增加耦合度
3.3 接口与抽象类
接口(interface)定义行为契约,Java 8开始接口可以有默认方法和静态方法。
java复制public interface Logger {
void log(String message); // 抽象方法
default void logError(String error) { // 默认方法
log("ERROR: " + error);
}
static Logger getConsoleLogger() { // 静态方法
return message -> System.out.println(message);
}
}
抽象类(abstract class)是不能被实例化的类,可以包含抽象方法和具体实现。
java复制public abstract class Shape {
protected String color;
public Shape(String color) {
this.color = color;
}
public abstract double area(); // 抽象方法
public String getColor() { // 具体方法
return color;
}
}
关键区别:
- 类可以实现多个接口,但只能继承一个类(包括抽象类)
- 接口不能有实例字段(Java 8之前)
- 抽象类可以有构造方法,接口不能
4. Java核心API精要
4.1 集合框架
Java集合框架主要分为两大类:
-
Collection接口:表示一组对象
- List:有序可重复 (ArrayList, LinkedList)
- Set:无序不重复 (HashSet, TreeSet)
- Queue:队列 (LinkedList, PriorityQueue)
-
Map接口:键值对映射
- HashMap
- TreeMap
- LinkedHashMap
java复制// Java 9+ 集合工厂方法
List<String> names = List.of("Alice", "Bob", "Charlie"); // 不可变集合
Map<String, Integer> scores = Map.of("Alice", 90, "Bob", 85);
// 流式处理
List<String> filtered = names.stream()
.filter(name -> name.length() > 4)
.collect(Collectors.toList());
性能提示:ArrayList随机访问快(O(1)),LinkedList插入删除快(O(1));HashMap查找快(O(1)),但需要好的hashCode实现
4.2 异常处理
Java异常体系:
- Throwable
- Error:系统错误,如OutOfMemoryError
- Exception
- RuntimeException:未检查异常(NullPointerException等)
- 其他Exception:已检查异常(必须处理)
最佳实践:
- 不要捕获Throwable或Error
- 不要吞掉异常(空的catch块)
- 优先使用特定异常而非通用Exception
- 自定义异常应提供有用的错误信息
- Java 7+支持try-with-resources自动资源管理
java复制// try-with-resources示例
try (InputStream in = new FileInputStream("file.txt");
OutputStream out = new FileOutputStream("output.txt")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
System.err.println("I/O error: " + e.getMessage());
}
4.3 并发编程
Java并发核心组件:
- 线程基础:Thread类,Runnable接口
- 线程池:Executor框架
- 同步机制:
- synchronized关键字
- volatile变量
- Lock接口及其实现
- 并发集合:ConcurrentHashMap, CopyOnWriteArrayList等
- 原子类:AtomicInteger, AtomicReference等
- Future和CompletableFuture
java复制// CompletableFuture示例
CompletableFuture.supplyAsync(() -> fetchDataFromDB())
.thenApply(data -> processData(data))
.thenAccept(result -> saveResult(result))
.exceptionally(ex -> {
System.err.println("Error: " + ex.getMessage());
return null;
});
// 并发集合使用
ConcurrentMap<String, Long> wordCounts = new ConcurrentHashMap<>();
words.parallelStream().forEach(word -> {
wordCounts.merge(word, 1L, Long::sum);
});
并发陷阱:竞态条件、死锁、活锁、内存可见性问题。推荐阅读《Java并发编程实战》
5. JVM原理与性能优化
5.1 内存模型
JVM内存主要分为:
- 方法区(Metaspace):存储类信息、常量、静态变量等
- 堆:对象实例存储区域(GC主要工作区)
- 虚拟机栈:线程私有,存储栈帧(局部变量表、操作数栈等)
- 本地方法栈:Native方法服务
- 程序计数器:线程私有,指示当前线程执行位置
java复制// 内存相关参数示例
// -Xms512m -Xmx1024m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m
5.2 垃圾回收机制
GC主要关注堆内存回收,常见算法:
- 标记-清除
- 标记-整理
- 复制算法
- 分代收集(新生代+老年代)
Java 8默认使用Parallel GC,Java 11+默认G1 GC。ZGC和Shenandoah是新的低延迟GC。
bash复制# 查看GC日志
java -Xlog:gc* -jar myapp.jar
5.3 类加载机制
类加载过程:
- 加载:查找并加载类文件
- 验证:确保类文件符合规范
- 准备:为静态变量分配内存并初始化默认值
- 解析:将符号引用转为直接引用
- 初始化:执行静态代码块和静态变量赋值
类加载器层次:
- Bootstrap ClassLoader:加载JRE核心类
- Extension ClassLoader:加载扩展库
- Application ClassLoader:加载应用类
- 自定义ClassLoader
java复制// 自定义类加载器示例
class MyClassLoader extends ClassLoader {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
byte[] bytes = loadClassData(name);
return defineClass(name, bytes, 0, bytes.length);
}
private byte[] loadClassData(String className) {
// 从自定义位置加载类文件
}
}
6. Java新特性概览
6.1 Java 8革命性更新
- Lambda表达式:
java复制List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.sort((a, b) -> a.compareTo(b));
- Stream API:
java复制double average = employees.stream()
.filter(e -> e.getDepartment().equals("IT"))
.mapToInt(Employee::getSalary)
.average()
.orElse(0);
- Optional类:
java复制Optional<User> user = findUserById(id);
user.ifPresent(u -> sendEmail(u.getEmail()));
6.2 Java 9-17重要特性
- 模块系统(Java 9):
java复制module com.myapp {
requires java.base;
requires java.sql;
exports com.myapp.api;
}
- 局部变量类型推断(Java 10):
java复制var list = new ArrayList<String>(); // 自动推断为ArrayList<String>
- Switch表达式(Java 12):
java复制String dayType = switch (day) {
case "Monday", "Friday" -> "Start/End";
case "Tuesday", "Wednesday", "Thursday" -> "Midweek";
default -> "Weekend";
};
- 文本块(Java 13):
java复制String json = """
{
"name": "John",
"age": 30,
"city": "New York"
}
""";
- Record类(Java 14):
java复制public record Point(int x, int y) {}
- Sealed类(Java 15):
java复制public abstract sealed class Shape
permits Circle, Square, Rectangle {}
7. 高效复习方法与资源推荐
7.1 分阶段复习计划
-
基础阶段(1-2周):
- 语言基础
- 面向对象概念
- 核心API使用
-
进阶阶段(2-3周):
- 并发编程
- JVM原理
- 设计模式
-
实战阶段(持续):
- 项目实践
- LeetCode算法题
- 开源项目贡献
7.2 推荐资源
-
书籍:
- 《Java核心技术 卷I》
- 《Effective Java》
- 《Java并发编程实战》
- 《深入理解Java虚拟机》
-
在线学习:
- Oracle官方Java教程
- Java文档和JSR规范
- Baeldung、InfoQ等技术博客
-
实践平台:
- LeetCode (Java实现算法)
- Codewars
- GitHub开源项目
7.3 常见面试问题准备
-
基础问题:
- ==和equals的区别
- String的不可变性
- 接口与抽象类的区别
-
集合框架:
- HashMap实现原理
- ConcurrentHashMap如何保证线程安全
- ArrayList与LinkedList比较
-
并发编程:
- synchronized实现原理
- volatile关键字作用
- ThreadLocal使用场景
-
JVM相关:
- 内存模型
- 垃圾回收算法
- 类加载过程
-
设计模式:
- 单例模式实现
- Spring中使用的设计模式
- 工厂模式应用场景
8. 实战:构建小型Java项目
8.1 项目构思:简易银行系统
核心功能:
- 账户管理(创建、查询)
- 存款/取款
- 转账
- 交易记录
技术要点:
- 面向对象设计
- 集合框架应用
- 异常处理
- 文件IO(可选)
- 单元测试
8.2 核心代码结构
java复制// 账户类
public class Account {
private String accountNumber;
private String owner;
private double balance;
private List<Transaction> transactions;
// 构造方法、存取款方法等
}
// 交易记录类
public class Transaction {
private LocalDateTime timestamp;
private String type; // "DEPOSIT", "WITHDRAW", "TRANSFER"
private double amount;
private String description;
}
// 银行服务类
public class BankService {
private Map<String, Account> accounts;
public void transfer(String fromAccNum, String toAccNum, double amount) {
// 实现转账逻辑
}
}
// 主程序
public class BankApp {
public static void main(String[] args) {
// 初始化并运行银行系统
}
}
8.3 扩展方向
- 增加数据库存储(H2/MySQL)
- 实现多线程并发访问
- 添加Web界面(Spring Boot)
- 引入日志系统(Log4j/SLF4J)
- 添加REST API
9. Java生态与职业发展
9.1 Java技术栈
主流Java技术方向:
-
Web开发:
- Spring框架(Spring Boot, Spring MVC, Spring Cloud)
- Jakarta EE(原Java EE)
-
大数据:
- Hadoop生态系统
- Spark
- Flink
-
移动开发:
- Android开发(Kotlin现在更主流)
-
企业应用:
- 金融系统
- 电商平台
- ERP系统
9.2 学习路线建议
-
初级阶段:
- Java核心语法
- 常用API
- 基本算法和数据结构
-
中级阶段:
- 框架学习(Spring)
- 数据库(JDBC, JPA/Hibernate)
- 系统设计基础
-
高级阶段:
- 分布式系统
- 性能调优
- 架构设计
9.3 认证体系
-
Oracle认证:
- Oracle Certified Associate (OCA)
- Oracle Certified Professional (OCP)
- Oracle Certified Master (OCM)
-
Spring认证:
- Spring Professional Certification
-
其他:
- AWS Certified Developer
- Google Cloud Professional Developer
10. 持续学习与社区参与
10.1 保持技术敏感度
- 关注Java新版本发布
- 阅读JDK Enhancement Proposals(JEP)
- 参与技术社区讨论
- 定期review优秀开源项目代码
10.2 参与开源贡献
- 从文档改进开始
- 报告和修复简单bug
- 参与社区讨论
- 贡献代码
10.3 技术博客与分享
- 记录学习笔记
- 分享解决方案
- 参与技术大会
- 创建教学视频
Java作为一门成熟的编程语言,其深度和广度都值得开发者持续探索。系统性的复习不仅能巩固基础,更能帮助开发者理解语言设计哲学,写出更优雅、高效的代码。建议每隔1-2年进行一次全面复习,并结合实际项目经验不断深化理解。
