Skip to content

Java 版本发展史与特性详解

概述

Java 自 1995 年发布以来,经历了多个重要版本的迭代,每个版本都带来了新的特性、性能改进和语言增强。本文将详细介绍 Java 从 JDK 1.0 到最新版本的发展历程,重点分析每个版本的核心特性和功能改进。

版本发布策略

传统发布模式(1995-2017)

  • 发布周期:不定期,通常 2-3 年一个大版本
  • 特点:功能丰富,变化较大
  • LTS 概念:尚未引入

现代发布模式(2017-至今)

  • 发布周期:每 6 个月一个版本(3月和9月)
  • LTS 版本:每 3 年一个长期支持版本
  • 特点:小步快跑,持续改进

Java 版本详细介绍

JDK 1.0 (1996年1月)

代号:Oak

核心特性

  • Java 虚拟机(JVM):跨平台运行环境
  • 垃圾回收:自动内存管理
  • 多线程支持:内置线程模型
  • 安全模型:沙箱安全机制
  • 网络编程:Socket 和 URL 类

JDK 1.1 (1997年2月)

主要新特性

  • 内部类(Inner Classes):支持嵌套类定义
  • JavaBeans:组件化编程模型
  • JDBC:数据库连接标准
  • RMI:远程方法调用
  • 反射(Reflection):运行时类型信息
  • JIT 编译器:即时编译优化

代码示例

java
// 内部类示例
public class OuterClass {
    private int value = 10;
    
    class InnerClass {
        void display() {
            System.out.println("Value: " + value);
        }
    }
}

J2SE 1.2 (1998年12月)

代号:Playground

重大改进

  • Swing GUI:丰富的图形用户界面
  • 集合框架(Collections Framework):统一的数据结构
  • JIT 编译器改进:HotSpot JVM
  • 安全策略:细粒度权限控制
  • Java 2D API:2D 图形处理

集合框架示例

java
// 集合框架使用
import java.util.*;

public class CollectionExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Collections");
        
        Map<String, Integer> map = new HashMap<>();
        map.put("Java", 1998);
    }
}

J2SE 1.3 (2000年5月)

代号:Kestrel

主要特性

  • HotSpot JVM:性能大幅提升
  • Java Sound API:音频处理
  • JNDI:命名和目录服务
  • Java Platform Debugger Architecture (JPDA):调试架构
  • RMI-IIOP:与 CORBA 集成

J2SE 1.4 (2002年2月)

代号:Merlin

重要新增

  • 断言(Assertions):程序验证机制
  • 正则表达式:模式匹配支持
  • NIO(New I/O):非阻塞 I/O
  • 日志 API:java.util.logging
  • XML 处理:JAXP
  • 首选项 API:java.util.prefs

代码示例

java
// 断言示例
public class AssertionExample {
    public static void main(String[] args) {
        int value = 10;
        assert value > 0 : "Value must be positive";
        
        // 正则表达式
        String pattern = "\\d+";
        String text = "123";
        boolean matches = text.matches(pattern);
    }
}

J2SE 5.0 (2004年9月)

代号:Tiger

革命性特性

  • 泛型(Generics):类型安全的集合
  • 增强的 for 循环:foreach 语法
  • 自动装箱/拆箱:基本类型与包装类转换
  • 枚举(Enums):类型安全的常量
  • 可变参数(Varargs):方法参数数量可变
  • 注解(Annotations):元数据支持
  • 并发工具:java.util.concurrent

代码示例

java
// 泛型和增强 for 循环
public class Java5Features {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("Java");
        list.add("Generics");
        
        // 增强 for 循环
        for (String item : list) {
            System.out.println(item);
        }
        
        // 枚举
        enum Day { MONDAY, TUESDAY, WEDNESDAY }
        Day today = Day.MONDAY;
        
        // 可变参数
        printNumbers(1, 2, 3, 4, 5);
    }
    
    public static void printNumbers(int... numbers) {
        for (int num : numbers) {
            System.out.println(num);
        }
    }
}

Java SE 6 (2006年12月)

代号:Mustang

主要改进

  • 脚本引擎支持:javax.script
  • 编译器 API:javax.tools
  • HTTP 服务器 API:com.sun.net.httpserver
  • JDBC 4.0:数据库连接改进
  • JAX-WS 2.0:Web 服务支持
  • 性能优化:启动速度和内存使用

Java SE 7 (2011年7月)

代号:Dolphin

重要特性

  • Diamond 操作符:类型推断简化
  • 字符串 switch 语句:字符串作为 switch 条件
  • try-with-resources:自动资源管理
  • 多异常捕获:单个 catch 块处理多种异常
  • 数值字面量改进:二进制字面量和下划线分隔
  • NIO.2:文件系统 API
  • Fork/Join 框架:并行计算支持

代码示例

java
// Java 7 新特性
public class Java7Features {
    public static void main(String[] args) {
        // Diamond 操作符
        List<String> list = new ArrayList<>();
        
        // 字符串 switch
        String day = "MONDAY";
        switch (day) {
            case "MONDAY":
                System.out.println("Start of work week");
                break;
            case "FRIDAY":
                System.out.println("TGIF!");
                break;
        }
        
        // try-with-resources
        try (FileReader fr = new FileReader("file.txt");
             BufferedReader br = new BufferedReader(fr)) {
            String line = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // 多异常捕获
        try {
            // some code
        } catch (IOException | SQLException e) {
            e.printStackTrace();
        }
        
        // 数值字面量
        int binary = 0b1010;
        int million = 1_000_000;
    }
}

Java SE 8 (2014年3月) - LTS

代号:Spider

里程碑特性

  • Lambda 表达式:函数式编程支持
  • Stream API:集合的函数式操作
  • 方法引用:简化 Lambda 表达式
  • 默认方法:接口中的默认实现
  • Optional 类:空值处理
  • 新的日期时间 API:java.time
  • Nashorn JavaScript 引擎:替代 Rhino
  • 并行数组操作:Arrays.parallelSort

代码示例

java
// Java 8 函数式编程
import java.util.stream.*;
import java.time.*;

public class Java8Features {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        
        // Lambda 表达式和 Stream API
        names.stream()
             .filter(name -> name.length() > 3)
             .map(String::toUpperCase)
             .forEach(System.out::println);
        
        // Optional
        Optional<String> optional = Optional.of("Hello");
        optional.ifPresent(System.out::println);
        
        // 新的日期时间 API
        LocalDateTime now = LocalDateTime.now();
        LocalDate date = LocalDate.of(2024, Month.JANUARY, 1);
        
        // 默认方法
        interface Drawable {
            void draw();
            default void print() {
                System.out.println("Printing...");
            }
        }
    }
}

Java SE 9 (2017年9月)

重大变革

  • 模块系统(Project Jigsaw):JPMS
  • JShell:交互式编程环境
  • 改进的 Stream API:新的方法
  • 私有接口方法:接口中的私有方法
  • 多版本 JAR 文件:Multi-Release JAR
  • 进程 API 改进:ProcessHandle
  • 响应式流:Flow API

模块系统示例

java
// module-info.java
module com.example.myapp {
    requires java.base;
    requires java.logging;
    exports com.example.myapp.api;
}

Java SE 10 (2018年3月)

主要特性

  • 局部变量类型推断:var 关键字
  • 应用程序类数据共享:AppCDS
  • 垃圾回收器改进:G1 并行 Full GC
  • 根证书:CA 证书集合
  • 线程本地握手:Thread-Local Handshakes

代码示例

java
// var 关键字
public class Java10Features {
    public static void main(String[] args) {
        var list = new ArrayList<String>();
        var map = new HashMap<String, Integer>();
        var stream = list.stream();
        
        for (var item : list) {
            System.out.println(item);
        }
    }
}

Java SE 11 (2018年9月) - LTS

重要更新

  • HTTP 客户端 API:标准化 HTTP/2 支持
  • 字符串方法增强:isBlank(), lines(), strip()
  • 文件读写简化:Files.readString(), writeString()
  • Lambda 参数的 var:类型推断增强
  • Epsilon GC:无操作垃圾回收器
  • ZGC:实验性低延迟垃圾回收器
  • 移除 JavaFX:独立发布

代码示例

java
// Java 11 新特性
import java.net.http.*;
import java.nio.file.*;

public class Java11Features {
    public static void main(String[] args) throws Exception {
        // HTTP 客户端
        HttpClient client = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://api.example.com"))
            .build();
        
        // 字符串新方法
        String text = "  Hello World  ";
        System.out.println(text.isBlank());
        System.out.println(text.strip());
        
        // 文件操作
        String content = Files.readString(Paths.get("file.txt"));
        Files.writeString(Paths.get("output.txt"), "Hello");
        
        // Lambda 中的 var
        var list = List.of("a", "b", "c");
        list.forEach((var item) -> System.out.println(item));
    }
}

Java SE 12 (2019年3月)

新特性

  • Switch 表达式:预览特性
  • Shenandoah GC:实验性低暂停垃圾回收器
  • 微基准测试套件:JMH 集成
  • JVM 常量 API:动态常量支持

Java SE 13 (2019年9月)

主要改进

  • 文本块:多行字符串(预览)
  • Switch 表达式改进:yield 关键字
  • ZGC 改进:内存释放优化
  • Socket API 重新实现:NioSocketImpl

代码示例

java
// Java 13 文本块(预览)
public class Java13Features {
    public static void main(String[] args) {
        // 文本块
        String json = """
            {
                "name": "John",
                "age": 30,
                "city": "New York"
            }
            """;
        
        // Switch 表达式
        int dayNumber = 1;
        String dayType = switch (dayNumber) {
            case 1, 2, 3, 4, 5 -> {
                yield "Weekday";
            }
            case 6, 7 -> "Weekend";
            default -> "Invalid";
        };
    }
}

Java SE 14 (2020年3月)

重要特性

  • Switch 表达式:标准特性
  • 模式匹配 instanceof:预览特性
  • Records:数据类(预览)
  • 文本块:标准特性
  • 有用的 NullPointerException:详细错误信息
  • NUMA 感知的 G1:性能优化

代码示例

java
// Java 14 Records(预览)
public record Person(String name, int age) {
    // 自动生成构造器、getter、equals、hashCode、toString
}

public class Java14Features {
    public static void main(String[] args) {
        // 模式匹配 instanceof(预览)
        Object obj = "Hello";
        if (obj instanceof String str) {
            System.out.println(str.toUpperCase());
        }
        
        // Records 使用
        Person person = new Person("Alice", 30);
        System.out.println(person.name());
        System.out.println(person.age());
    }
}

Java SE 15 (2020年9月)

新增特性

  • 密封类:sealed classes(预览)
  • 隐藏类:Hidden Classes
  • EdDSA 签名算法:Edwards-Curve 数字签名
  • ZGC 和 Shenandoah:生产就绪
  • 文本块:最终版本
  • Records:第二次预览

Java SE 16 (2021年3月)

主要更新

  • Records:标准特性
  • 模式匹配 instanceof:标准特性
  • 密封类:第二次预览
  • Vector API:孵化器特性
  • 外部内存访问 API:孵化器特性
  • 启用 C++14 语言特性:JVM 开发

Java SE 17 (2021年9月) - LTS

重要里程碑

  • 密封类:标准特性
  • 模式匹配增强:switch 的模式匹配(预览)
  • 移除实验性 AOT 和 JIT 编译器:简化 JVM
  • 强封装 JDK 内部 API:安全性提升
  • 新的 macOS 渲染管道:Metal 支持
  • 外部函数和内存 API:孵化器特性

代码示例

java
// Java 17 密封类
public sealed class Shape
    permits Circle, Rectangle, Triangle {
}

public final class Circle extends Shape {
    private final double radius;
    
    public Circle(double radius) {
        this.radius = radius;
    }
}

public final class Rectangle extends Shape {
    private final double width, height;
    
    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }
}

Java SE 18 (2022年3月)

新特性

  • UTF-8 默认字符集:平台无关的默认编码
  • 简单 Web 服务器:jwebserver 命令
  • 代码片段 Javadoc 标签:@snippet
  • Vector API:第三次孵化
  • 外部函数和内存 API:第二次孵化
  • 模式匹配 switch:第二次预览

Java SE 19 (2022年9月)

主要改进

  • 虚拟线程:Project Loom(预览)
  • 结构化并发:孵化器特性
  • 模式匹配 switch:第三次预览
  • 外部函数和内存 API:预览特性
  • Vector API:第四次孵化

虚拟线程示例

java
// Java 19 虚拟线程(预览)
import java.util.concurrent.Executors;

public class Java19Features {
    public static void main(String[] args) {
        // 虚拟线程
        try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
            for (int i = 0; i < 1000; i++) {
                int taskId = i;
                executor.submit(() -> {
                    System.out.println("Task " + taskId + " running on " + 
                                     Thread.currentThread());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                });
            }
        }
    }
}

Java SE 20 (2023年3月)

新增功能

  • Scoped Values:孵化器特性
  • Record 模式:第二次预览
  • 模式匹配 switch:第四次预览
  • 外部函数和内存 API:第二次预览
  • 虚拟线程:第二次预览
  • 结构化并发:第二次孵化

Java SE 21 (2023年9月) - LTS

重要特性

  • 虚拟线程:标准特性
  • Sequenced Collections:有序集合接口
  • 模式匹配 switch:标准特性
  • Record 模式:标准特性
  • 字符串模板:预览特性
  • 未命名模式和变量:预览特性
  • KEM API:密钥封装机制

代码示例

java
// Java 21 新特性
import java.util.*;

public class Java21Features {
    public static void main(String[] args) {
        // Sequenced Collections
        SequencedSet<String> set = new LinkedHashSet<>();
        set.add("first");
        set.add("second");
        String first = set.getFirst();
        String last = set.getLast();
        
        // 模式匹配 switch
        Object obj = "Hello";
        String result = switch (obj) {
            case String s when s.length() > 5 -> "Long string: " + s;
            case String s -> "Short string: " + s;
            case Integer i -> "Number: " + i;
            case null -> "Null value";
            default -> "Unknown type";
        };
        
        // Record 模式
        record Point(int x, int y) {}
        Point point = new Point(1, 2);
        
        switch (point) {
            case Point(var x, var y) when x == y -> 
                System.out.println("Point on diagonal");
            case Point(var x, var y) -> 
                System.out.println("Point at (" + x + ", " + y + ")");
        }
    }
}

Java SE 22 (2024年3月)

最新特性

  • 未命名变量和模式:标准特性
  • 字符串模板:第二次预览
  • 隐式声明的类和实例 main 方法:预览特性
  • 外部函数和内存 API:标准特性
  • 多源文件程序:预览特性
  • 结构化并发:第三次孵化
  • Scoped Values:第二次孵化
  • Vector API:第七次孵化

Java SE 23 (2024年9月)

新增功能

  • 原始类型模式:预览特性
  • 模块导入声明:预览特性
  • 隐式声明的类和实例 main 方法:第二次预览
  • 字符串模板:第三次预览
  • ZGC 分代模式:标准特性
  • 结构化并发:第四次孵化

版本选择建议

LTS 版本推荐

  1. Java 8:广泛使用,生态成熟
  2. Java 11:现代 Java 的起点
  3. Java 17:当前主流选择
  4. Java 21:最新 LTS,推荐新项目使用

版本迁移路径

Java 8 → Java 11 → Java 17 → Java 21

企业级应用建议

  • 新项目:Java 21 LTS
  • 维护项目:Java 17 LTS
  • 遗留系统:Java 11 LTS(最低要求)

性能对比

启动时间改进

  • Java 8: 基准
  • Java 11: 10-15% 改进
  • Java 17: 20-25% 改进
  • Java 21: 30-35% 改进

内存使用优化

  • 压缩 OOP:减少内存占用
  • 字符串去重:G1GC 特性
  • 类数据共享:减少启动内存

垃圾回收器演进

Serial → Parallel → CMS → G1 → ZGC/Shenandoah

未来发展趋势

Project Loom

  • 虚拟线程:轻量级并发
  • 结构化并发:并发编程简化
  • Continuation:协程支持

Project Panama

  • 外部函数接口:本地代码调用
  • 外部内存访问:直接内存操作
  • Vector API:SIMD 指令支持

Project Valhalla

  • 值类型:内存布局优化
  • 泛型特化:性能提升
  • 原始类型泛型:类型系统增强

Project Amber

  • 模式匹配:函数式编程增强
  • 数据类:简化数据建模
  • 字符串模板:安全的字符串插值

学习建议

基础学习路径

  1. Java 8:Lambda、Stream、Optional
  2. Java 11:模块系统、HTTP 客户端
  3. Java 17:Records、密封类、模式匹配
  4. Java 21:虚拟线程、结构化并发

实践项目建议

  • Web 应用:Spring Boot + Java 21
  • 微服务:Spring Cloud + Java 17
  • 大数据:Kafka + Java 11
  • 云原生:GraalVM + Java 21

总结

Java 经过近 30 年的发展,从简单的面向对象语言演进为现代化的多范式编程平台。每个版本都在性能、安全性、开发效率和语言表达力方面带来显著改进。

关键里程碑

  • Java 5:泛型和注解,现代 Java 基础
  • Java 8:Lambda 和 Stream,函数式编程
  • Java 9:模块系统,大型应用架构
  • Java 17:现代语法特性完善
  • Java 21:虚拟线程,并发编程革命

发展方向

  • 性能优化:启动速度、内存使用、执行效率
  • 开发体验:语法简化、类型推断、模式匹配
  • 并发编程:虚拟线程、结构化并发
  • 互操作性:外部函数接口、本地代码集成
  • 云原生:容器化、微服务、响应式编程

Java 将继续在企业级应用开发中发挥重要作用,同时不断适应现代软件开发的需求和挑战。