十五、java新特性

119 阅读7分钟

Java 各版本新特性

(从 Java 5 ~ Java 21 全覆盖,语法+原理+代码示例+使用场景+面试点)


一、Java 5(里程碑,现代 Java 语法的起点)

1. 泛型(Generics)

  • 目的:在编译期进行类型检查,避免运行时 ClassCastException
  • 语法:List<String> list = new ArrayList<>()
  • 泛型擦除:
    • 编译后泛型信息会被删除,字节码中是原始类型
    • 运行时无泛型,泛型仅存在于源码和编译期
  • 通配符:
    • <?> 任意类型
    • <? extends E> 上界通配符(只读,生产者)
    • <? super E> 下界通配符(可写,消费者)

2. 增强 for 循环(foreach)

for (String s : list) { }
  • 底层:迭代器 Iterator
  • 不能在遍历中增删元素(否则 ConcurrentModificationException

3. 自动装箱 / 拆箱(Autoboxing)

  • 基本类型 ↔ 包装类 自动转换
  • Integer a = 10;Integer.valueOf(10)
  • int b = a;a.intValue()
  • 缓存池:Integer[-128,127]ByteShortLongCharacter[0,127]

4. 枚举(Enum)

enum Season { SPRING, SUMMER }
  • 本质是继承 Enum 的 final 类
  • 线程安全,可用于单例(最佳单例方案)

5. 注解(Annotation)

  • @Override@Deprecated@SuppressWarnings
  • 元注解雏形出现

6. 可变参数

void method(int... a) { }
  • 本质数组
  • 必须放在参数最后

7. 线程并发包(JUC 雏形)

  • java.util.concurrent
  • ThreadPoolExecutorExecutorServiceCountDownLatchLock

二、Java 6

1. 编译器优化

  • 启动性能提升

2. JDBC 4.0

  • 驱动自动加载,无需 Class.forName

3. Compiler API

  • 程序内动态编译 Java 代码

4. 轻量级 HTTP 服务器 com.sun.net.httpserver

5. 对脚本语言的支持(JSR 223)

  • 可调用 JS、Python 等

三、Java 7(大量实用语法)

1. switch 支持 String

switch (str) {
    case "A": break;
}

2. 数字字面量下划线

int a = 1_000_000;

3. 泛型类型推断(钻石运算符)

List<String> list = new ArrayList<>();

4. 多异常捕获(catch 合并)

catch (IOException | SQLException e) { }

5. try-with-resources

  • 实现 AutoCloseable 接口的资源自动关闭
  • 彻底解决流未关闭泄漏问题

6. NIO 2.0(Path、Paths、Files)

Path path = Paths.get("a.txt");
Files.copy(in, out);
Files.deleteIfExists(path);
  • 比传统 File 类更强大

7. Fork/Join 框架

  • 大任务拆分,并行执行
  • 适合 CPU 密集型

四、Java 8(企业核心,最重要版本,LTS)

1. Lambda 表达式

语法

(parameters) -> { statements; }

使用前提

必须是函数式接口:接口中只有一个抽象方法 @FunctionalInterface 注解用于校验

内置函数式接口(4 大核心)

  • Consumer<T>void accept(T t) 消费型
  • Supplier<T>T get() 供给型
  • Function<T,R>R apply(T t) 函数型
  • Predicate<T>boolean test(T t) 判断型

闭包特性

Lambda 访问外部变量,默认隐式 final

2. 方法引用 / 构造器引用

  • 静态方法:类名::方法
  • 实例方法:对象::方法
  • 构造方法:类名::new

示例:

list.forEach(System.out::println);

3. Stream API

三大阶段

  1. 创建流
    • stream()parallelStream()
    • Stream.of()Arrays.stream()
  2. 中间操作(惰性,可链式)
    • filter 过滤
    • map 映射
    • flatMap 扁平化
    • distinct 去重
    • sorted 排序
    • limit / skip
  3. 终止操作(触发执行)
    • forEach
    • collect 收集(toListjoininggroupingBy
    • reduce 归约
    • countminmax

特点

  • 惰性求值:不调用终止操作,中间操作不执行
  • 不存储数据
  • 一次性使用,不能重复操作

4. Optional 类(解决 NPE)

核心方法

  • Optional.ofNullable(obj):允许 null
  • Optional.of(obj):不允许 null
  • isPresent():判断是否非 null
  • ifPresent():非 null 才执行
  • orElse():null 返回默认值
  • orElseGet():null 执行 Supplier
  • orElseThrow():null 抛异常
  • map() / flatMap():链式获取深层属性

5. 全新日期时间 API(java.time)

核心类

  • LocalDate:日期
  • LocalTime:时间
  • LocalDateTime:日期+时间
  • Instant:时间戳
  • DateTimeFormatter:线程安全格式化
  • Duration:时间差(秒/纳秒)
  • Period:日期差(年月日)

优势

  • 不可变类,线程安全
  • 设计清晰,API 语义化
  • 彻底替代 SimpleDateFormat

6. 接口默认方法(default)和静态方法

default void method() {}
static void staticMethod() {}
  • 解决接口扩展兼容性问题
  • 实现类可直接使用,也可重写

7. HashMap 优化

  • JDK8:数组 + 链表 + 红黑树
  • 链表长度 ≥8 且数组长度≥64 转为红黑树
  • 退化为链表:≤6 个节点
  • 尾插法替代头插法,避免并发死链

8. ConcurrentHashMap 优化

  • 取消 Segment 分段锁
  • 采用 CAS + synchronized
  • 锁粒度更细,性能大幅提升

9. Nashorn JavaScript 引擎

  • 替代 Rhino
  • 可在 Java 中执行 JS

10. Base64 内置支持

  • java.util.Base64
  • 无需第三方包

五、Java 9

1. 模块化系统(Module System)

  • module-info.java
  • requires 依赖模块
  • exports 导出包
  • opens 开放反射
  • 目的:减少内存占用、安全隔离、更快启动

2. 不可变集合工厂方法

List.of(1,2,3);
Set.of(1,2);
Map.of("k1",1,"k2",2);
  • 不可变,添加删除抛 UnsupportedOperationException

3. 接口私有方法

private void method() {}
  • 供默认方法复用代码

4. Stream 增强

  • takeWhile:满足条件就取
  • dropWhile:满足条件就丢弃
  • ofNullable:空安全流
  • 新的 iterate 重载

5. Optional 增强

  • stream()
  • ifPresentOrElse()
  • or():为空则返回备选 Optional

6. JShell 交互式工具

  • 直接执行代码片段,无需类和方法

7. 多分辨率图像 API

8. 响应式流(Reactive Streams)

  • java.util.concurrent.Flow

六、Java 10

1. 局部变量类型推断 var

var list = new ArrayList<String>();
var stream = list.stream();

使用限制

  • 只能用于局部变量
  • 不能用于方法参数、返回值、成员变量
  • 必须初始化,不能 var a;
  • 不能赋值为 null

2. 不可变集合 copyOf

List.copyOf(list);

3. G1 成为默认 GC

4. 线程局部管控(Thread-Local Handshakes)

  • 可单独停止一个线程,提高 Stop-The-World 效率

七、Java 11(LTS,企业主流)

1. String 增强

  • isBlank():是否空白
  • strip():去除空白(支持全角,比 trim 强)
  • stripLeading() / stripTrailing()
  • lines():按行转 Stream
  • repeat(n):重复字符串

2. HttpClient 标准化

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(URI.create("url")).GET().build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
      .thenApply(HttpResponse::body)
      .thenAccept(System.out::println);
  • 支持 HTTP/2、异步、响应式流
  • 替代 HttpURLConnection

3. var 支持 Lambda 参数

(var a, var b) -> a + b

4. 启动单个 Java 源文件

java Hello.java
  • 无需手动 javac 编译

5. 移除 Java EE 模块

  • CORBA、XML 绑定等

6. ZGC 并发垃圾收集器(实验性)

  • 超低延迟 GC

7. 飞行记录器 JFR 开源

  • 生产环境性能监控

8. 废弃 Nashorn


八、Java 12~Java 16(语法糖爆发期)

1. Switch 表达式(Java 12 预览 → 14 正式)

  • 可返回值
  • 箭头语法,无穿透,无需 break
String s = switch (a) {
    case 1 -> "一";
    case 2 -> "二";
    default -> "其他";
};
  • yield 关键字返回块内值

2. instanceof 模式匹配(Java 14 预览 → 16 正式)

if (obj instanceof String str) {
    System.out.println(str.length());
}
  • 自动类型转换,无需强转

3. Records 记录类(Java 14 预览 → 16 正式)

record Point(int x, int y) {}

自动生成:

  • 全参构造
  • x()y() 访问方法
  • equalshashCode
  • toString
  • 不可变数据类,替代 POJO/DTO

4. 密封类(Sealed Classes,Java 15 预览 → 17 正式)

sealed class Shape permits Circle, Rectangle {}
  • 限制只能指定子类继承
  • 提高安全性、模式匹配完整性

5. Vector API(孵化)

  • 利用 CPU 矢量指令提升计算性能

九、Java 17(最新 LTS,企业未来标准)

1. 密封类正式可用

2. 增强伪随机数生成器 API

3. 移除实验特性:AOT、Graal 试验部分

4. 模式匹配 for Switch(预览)

String result = switch (obj) {
    case Integer i -> "int";
    case String s -> "string";
    case null -> "null";
    default -> "other";
};

5. 完整的 Linux/AArch64 支持

6. 性能、安全、GC 全面升级

  • G1、ZGC、Shenandoah 成熟稳定

十、Java 18~Java 21(最新稳定版)

Java 18

  • 默认 UTF-8
  • SimpleWebServer 简易 HTTP 服务
  • 方法句柄重新实现

Java 19

  • 虚拟线程(预览)
  • 模式匹配再次增强

Java 21(LTS,下一代企业标准)

1. 虚拟线程(Virtual Threads)正式

  • 百万级轻量级线程
  • 极低切换成本
  • 代码不变,并发能力指数提升

2. 模式匹配 for Switch 正式

3. Record 模式匹配

if (obj instanceof Point(int x, int y)) {}

4. 序列集合(Sequenced Collections)

  • getFirst()getLast()reversed()

5. ZGC 无停顿 GC 成熟

6. 完整泛型模式匹配体系


十一、企业级重点总结(超详细版)

1. 现代 Java 开发必备

  • Java 8:Lambda + Stream + Optional + 新日期
  • Java 11:String 增强 + HttpClient + var
  • Java 17:密封类 + 模式匹配 + Record
  • Java 21:虚拟线程 + 完整模式匹配

2. 语法演进主线

  • 简化代码:Lambda、var、Record、Switch 表达式
  • 空安全:Optional、模式匹配
  • 并发:JUC、虚拟线程、高性能 GC
  • 安全:密封类、模块化

3. 版本选择

  • 老项目:Java 8
  • 中型项目:Java 11
  • 新项目/微服务:Java 17 / Java 21

十二、面试深度考点(完整不精简)

  1. Lambda 与匿名内部类的区别
  2. Stream 惰性求值原理与执行流程
  3. Optional 为什么能避免 NPE,如何避免过度嵌套
  4. Java 8 日期 API 不可变性与线程安全
  5. 泛型擦除机制与通配符区别
  6. try-with-resources 自动关闭原理
  7. switch 表达式与传统 switch 区别
  8. instanceof 模式匹配带来的效率提升
  9. Record 实现原理与不可变性
  10. 密封类的设计意义与模式匹配配合
  11. 虚拟线程与平台线程区别
  12. Java 各版本 GC 演进路线