一、JDK 8(LTS,2014年3月)- 革命性更新
核心特性
-
Lambda表达式
// 旧方式
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return a.compareTo(b);
}
});// Lambda方式
Collections.sort(list, (a, b) -> a.compareTo(b)); -
Stream API
List<String> filtered = list.stream()
.filter(s -> s.startsWith("A"))
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList()); -
默认方法(Default Methods)
interface Vehicle {
default void print() {
System.out.println("我是一辆车");
}
}interface FourWheeler {
default void print() {
System.out.println("我有四个轮子");
}
}class Car implements Vehicle, FourWheeler {
@Override
public void print() {
Vehicle.super.print();
FourWheeler.super.print();
}
} -
新的日期时间API
// 旧Date问题多,新API更清晰
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1);
LocalTime now = LocalTime.now();// 格式化
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formatted = LocalDateTime.now().format(formatter); -
Optional类
Optional<String> optional = Optional.ofNullable(getString());
optional.ifPresent(System.out::println);
String result = optional.orElse("默认值");
常用功能
-
方法引用 :
list.forEach(System.out::println) -
函数式接口 :
@FunctionalInterface -
Nashorn JavaScript引擎
-
Base64支持
二、JDK 11(LTS,2018年9月)
核心特性
-
局部变量类型推断增强
var list = new ArrayList<String>(); // 推断为ArrayList<String>
var stream = list.stream(); // 推断为Stream<String> -
HTTP Client API(标准化)
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com"))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString()); -
字符串增强方法
String str = " Hello World ";
str.isBlank(); // 检查是否为空或仅空白字符
str.strip(); // 去除首尾空白(比trim()更严格)
str.repeat(3); // 重复字符串
str.lines().count(); // 行数统计 -
单文件源码程序
直接运行.java文件
java HelloWorld.java
-
Flight Recorder(JFR)开源
启动JFR
java -XX:StartFlightRecording=duration=60s,filename=recording.jfr
性能改进
-
ZGC:可扩展的低延迟垃圾收集器(实验性)
-
Epsilon GC:无操作垃圾收集器(性能测试用)
三、JDK 17(LTS,2021年9月)- 当前主流LTS
核心特性
-
密封类(Sealed Classes)
public abstract sealed class Shape
permits Circle, Rectangle, Triangle {
// 只有这三个子类可以继承
}public final class Circle extends Shape { /* ... / }
public final class Rectangle extends Shape { / ... / }
public final class Triangle extends Shape { / ... */ } -
模式匹配switch(预览)
static String formatter(Object obj) {
return switch (obj) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> obj.toString();
};
} -
文本块(标准化)
// 多行字符串
String json = """
{
"name": "张三",
"age": 25,
"address": {
"city": "北京",
"street": "中关村"
}
}
""";
重要移除
-
移除了Applet API
-
移除了Security Manager
四、各版本特性速查表
JDK 9(2017)
// 模块系统(Project Jigsaw)
module com.example {
requires java.base;
exports com.example.api;
}
// 集合工厂方法
List<String> list = List.of("A", "B", "C");
Set<Integer> set = Set.of(1, 2, 3);
Map<String, Integer> map = Map.of("A", 1, "B", 2);
// 私有接口方法
interface MyInterface {
default void method1() {
commonMethod();
}
private void commonMethod() {
// 私有辅助方法
}
}
JDK 10(2018)
- 局部变量类型推断(var)
JDK 12-16(非LTS重要特性)
JDK 14
// instanceof模式匹配
if (obj instanceof String s) {
// 可以直接使用s
System.out.println(s.length());
}
// Records(数据类)
record Point(int x, int y) { }
Point p = new Point(10, 20);
System.out.println(p.x()); // 自动生成getter
JDK 15
-
文本块转为正式功能
-
Shenandoah GC成为正式功能
JDK 16
-
Records转为正式功能
-
Pattern Matching for instanceof转为正式
五、企业开发常用功能详解
1. Stream API高级用法
// 分组统计
Map<Department, Long> countByDept = employees.stream()
.collect(Collectors.groupingBy(
Employee::getDepartment,
Collectors.counting()
));
// 并行流处理
List<String> results = dataList.parallelStream()
.filter(item -> item.isValid())
.map(item -> process(item))
.collect(Collectors.toList());
// 自定义收集器
Collector<Employee, ?, Map<String, Double>> avgSalaryByDept =
Collectors.groupingBy(
Employee::getDepartment,
Collectors.averagingDouble(Employee::getSalary)
);
-
CompletableFuture异步编程
CompletableFuture<String> future1 = CompletableFuture
.supplyAsync(() -> fetchDataFromAPI1());
CompletableFuture<String> future2 = CompletableFuture
.supplyAsync(() -> fetchDataFromAPI2());CompletableFuture<Void> combined = CompletableFuture
.allOf(future1, future2);// 组合多个结果
future1.thenCombine(future2, (result1, result2) ->
processResults(result1, result2))
.exceptionally(ex -> handleError(ex)); -
Optional最佳实践
// 链式调用
String result = Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getCity)
.orElse("未知城市");// 抛出异常
User user = userRepository.findById(id)
.orElseThrow(() -> new UserNotFoundException(id));// 条件执行
optionalUser.ifPresentOrElse(
user -> processUser(user),
() -> log.warn("用户不存在")
);
六、版本选择建议
生产环境推荐
-
新项目:JDK 17+(LTS,长期支持)
-
现有系统:
-
金融/保险:JDK 11或17
-
互联网:根据框架支持选择(Spring Boot 3+需要JDK 17)
-
传统企业:JDK 8(逐步迁移)
-
迁移注意事项
-
JDK 8 → JDK 11:
-
移除Java EE模块(javax.xml.ws等)
-
需要添加相应依赖
-
检查废弃API使用
-
-
JDK 11 → JDK 17:
-
密封类、记录类等新特性
-
更强的封装(反射限制)
-
移除过时GC算法
-
版本维护周期
-
Oracle JDK:每6个月一个版本,每3年一个LTS
-
商用支持:LTS版本有长期技术支持
-
开源选择:OpenJDK、Amazon Corretto、Azul Zulu
七、实用工具和命令
JVM参数调优
# 内存设置
-Xms2g -Xmx2g -Xmn1g
# GC选择(JDK 11+)
-XX:+UseG1GC
# 记录GC日志
-Xlog:gc*:file=gc.log:time,uptime,level,tags
# 开启JFR(JDK 11+)
-XX:StartFlightRecording=delay=5s,duration=60s,filename=recording.jfr
模块化开发(JDK 9+)
// module-info.java
module com.myapp {
requires java.base;
requires java.sql;
requires transitive com.mylib; // 传递依赖
exports com.myapp.api;
opens com.myapp.internal to spring.core;
}
总结
JDK的发展聚焦于:
-
语言现代化:Lambda、模式匹配、记录类
-
性能提升:新GC算法、JIT优化
-
开发效率:Stream API、HTTP Client
-
安全性:模块化、强封装
-
云原生:容器支持、轻量级运行时
建议持续关注OpenJDK官网和JEP(JDK Enhancement Proposal)获取最新特性信息。