Java8-21的核心特性以及用法

Java 8 至 Java 23 版本特性对比表 Java 8 至 Java 23 版本特性对比 阅读详情

Java8

1. Lambda表达式‌

‌理解‌:简化匿名内部类,允许将函数作为方法参数传递。
‌用法‌:(参数) -> {表达式或代码块}
‌示例‌:

// 传统匿名内部类
Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello");
    }
};

// Lambda简化
Runnable r2 = () -> System.out.println("Hello");

‌2. Stream API‌

‌理解‌:函数式数据流操作(过滤、映射、聚合等),支持链式调用。
‌用法‌:通过stream()创建流,结合filter/map/collect等方法。
‌示例‌:

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> filtered = names.stream()
    .filter(name -> name.startsWith("A")) // 过滤
    .map(String::toUpperCase)             // 映射
    .collect(Collectors.toList());        // 收集为List

‌3. 方法引用‌

‌理解‌:进一步简化Lambda,直接引用已有方法。
‌用法‌:类名::方法名 或 对象::方法名。

  • 静态方法引用:ClassName::staticMethod
  • 实例方法引用:instance::method 或 ClassName::instanceMethod(特殊形式)
  • 构造方法引用:ClassName::new

‌示例‌:

// Lambda写法
names.forEach(name -> System.out.println(name));

// 方法引用简化
names.forEach(System.out::println);

// 1. 静态方法引用
Function<String, Integer> f1 = Integer::parseInt;

// 2. 绑定实例方法引用
String str = "test";
Supplier<Integer> f2 = str::length;

// 3. 未绑定实例方法引用
Function<String, Integer> f3 = String::length;

// 4. 构造方法引用
Supplier<List<String>> f4 = ArrayList::new;

‌4. 默认方法(Default Methods)‌

‌理解‌:接口中可以定义默认实现,避免破坏现有实现类。
‌用法‌:default关键字修饰接口方法。
‌示例‌:

interface Vehicle {
    default void start() {
        System.out.println("Vehicle started");
    }
}

class Car implements Vehicle {} // 无需重写start()

‌5. Optional类‌

‌理解‌:包装可能为null的值,避免空指针异常。
‌用法‌:Optional.ofNullable()结合orElse()/ifPresent()。

原理:

   

  1. ‌封装与空安全‌
  • 本质是泛型不可变容器类(final class Optional<T>)
  • 通过私有构造器强制要求非空值必须显式包装
  • 空值统一用private static final Optional<?> EMPTY表示
  1. ‌核心实现机制‌
  • 值存储:private final T value字段存储实际对象
  • 空检查:所有方法内部首先检查value == null
  • 链式调用:方法返回新Optional实例保证不可变性
  1. ‌关键方法实现‌
  • of():直接赋值前进行非空校验(Objects.requireNonNull)
  • ofNullable():允许传入null值,内部转为EMPTY实例
  • map()/flatMap():通过函数式接口实现惰性求值
  • orElse():通过Supplier延迟备选值计算
  1. ‌线程安全设计‌
  • 所有字段声明为final(包括存储的value)
  • 不提供修改内部状态的方法
  • 每次操作返回新实例(类似String的不可变性)
  1. ‌性能优化点‌
  • EMPTY单例模式减少对象创建
  • 静态工厂方法避免重复校验
  • 流式API避免中间对象分配

‌示例‌:

Optional<String> name = Optional.ofNullable(getName());
String result = name.orElse("Default"); // 如果为null返回默认值
name.ifPresent(System.out::println);    // 非空时执行

‌6. 新的日期时间API(java.time)‌

‌理解‌:替代java.util.Date,线程安全且易用。
‌核心类‌:LocalDate、LocalTime、ZonedDateTime、LocalDateTime。
‌示例‌:

LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plusDays(7);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String formatted = today.format(formatter);

‌7. 函数式接口(@FunctionalInterface)‌

‌理解‌:只有一个抽象方法的接口,支持Lambda。

Java 8中主要的函数式接口可分为四大类,位于java.util.function包中:

一、核心函数式接口

  1. ‌Function<T,R>‌

    • 方法:R apply(T t)

    • 用途:接受一个输入返回一个结果

  2. ‌Consumer<T>‌

    • 方法:void accept(T t)

    • 用途:消费一个输入不返回结果

  3. ‌Supplier<T>‌

    • 方法:T get()

    • 用途:无输入返回一个值

  4. ‌Predicate<T>‌

    • 方法:boolean test(T t)

    • 用途:输入判断返回布尔值

二、原始类型特化接口

  1. ‌IntFunction<R>‌ / ‌DoubleFunction<R>‌

    • 专为基本类型优化的Function

  2. ‌ToIntFunction<T>‌ / ‌ToDoubleFunction<T>‌

    • 返回基本类型的Function

  3. ‌IntConsumer‌ / ‌DoubleConsumer‌

    • 基本类型的Consumer

三、二元操作接口

  1. ‌BiFunction<T,U,R>‌

    • 方法:R apply(T t, U u)

    • 双参数Function

  2. ‌BiConsumer<T,U>‌

    • 方法:void accept(T t, U u)

    • 双参数Consumer

  3. ‌BiPredicate<T,U>‌

    • 方法:boolean test(T t, U u)

    • 双参数Predicate

四、组合与特殊接口

  1. ‌UnaryOperator<T>‌

    • 继承Function<T,T>

    • 输入输出类型相同

  2. ‌BinaryOperator<T>‌

    • 继承BiFunction<T,T,T>

    • 两个同类型输入返回同类型结果

  3. ‌ObjIntConsumer<T>‌

    • 方法:void accept(T t, int value)

    • 混合对象与基本类型的Consumer

其他重要接口

  1. ‌Comparator<T>‌

    • 方法:int compare(T o1, T o2)

    • 排序专用接口

  2. ‌Runnable‌

    • 方法:void run()

    • 多线程基础接口

这些接口都使用@FunctionalInterface注解标注,支持lambda表达式和方法引用。实际开发中,90%的场景使用前4个核心接口即可满足需求,特殊场景才会用到其他特化接口。

‌示例‌:

@FunctionalInterface
interface Greeting {
    void sayHello(String name);
}

Greeting greet = name -> System.out.println("Hello, " + name);
greet.sayHello("Alice");

8. 并行流(Parallel Stream)‌

‌理解‌:利用多核CPU并行处理数据。
‌用法‌:通过parallelStream()创建。
‌示例‌:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.parallelStream().reduce(0, Integer::sum);
Java 8并行流特性详解

一、并行流基本概念

Java 8的并行流(Parallel Stream)是Stream API的一个重要特性,它允许将流操作自动并行化处理,利用多核处理器的优势提高数据处理效率。

二、核心原理

  1. ‌Fork/Join框架基础‌

    • 并行流底层使用Fork/Join框架实现

    • 采用工作窃取(work-stealing)算法提高并行效率

    • 默认使用ForkJoinPool.commonPool()线程池

  2. ‌分割-执行-合并模式‌

    • 将数据源分割为多个子集

    • 并行处理各个子集

    • 合并处理结果

  3. ‌并行度控制‌

    • 默认并行度等于CPU核心数

    • 可通过System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "N")调整

三、使用方法

1. 创建并行流

// 从集合创建并行流 List<String> list = Arrays.asList("a", "b", "c"); Stream<String> parallelStream = list.parallelStream(); // 将顺序流转为并行流 Stream<String> stream = Stream.of("a", "b", "c"); Stream<String> parallel = stream.parallel();

2. 常用并行操作

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // 并行过滤 List<Integer> evenNumbers = numbers.parallelStream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); // 并行映射 List<Integer> squaredNumbers = numbers.parallelStream() .map(n -> n * n) .collect(Collectors.toList()); // 并行归约 int sum = numbers.parallelStream() .reduce(0, Integer::sum);

四、性能考虑因素

  1. ‌数据量大小‌

    • 小数据集(通常<1000元素)可能不适合并行

    • 大数据集更能体现并行优势

  2. ‌操作特性‌

    • 计算密集型操作适合并行

    • I/O密集型操作可能不适合

  3. ‌可分解性‌

    • ArrayList、数组等可高效分割

    • LinkedList等分割成本较高

  4. ‌合并成本‌

    • 某些操作(如collect)的合并成本可能较高

五、注意事项

  1. ‌线程安全问题‌

    • 并行流操作应避免共享可变状态

    • 确保操作是无状态的

  2. ‌顺序依赖‌

    • 并行流不保证处理顺序

    • 需要顺序时使用forEachOrdered

  3. ‌短路操作‌

    • findFirst等操作在并行下可能性能下降

    • 考虑使用findAny替代

  4. ‌副作用‌

    • 避免在并行流中产生副作用

    • 使用线程安全的数据结构或同步机制

六、高级用法

  1. ‌自定义线程池‌

ForkJoinPool customPool = new ForkJoinPool(4); customPool.submit(() -> list.parallelStream() .forEach(System.out::println) ).get();

  1. ‌避免共享状态‌

// 错误示例 - 共享可变状态 int[] sum = {0}; numbers.parallelStream().forEach(n -> sum[0] += n); // 线程不安全 // 正确做法 int safeSum = numbers.parallelStream().reduce(0, Integer::sum);

  1. ‌性能监控‌

long start = System.nanoTime(); result = data.parallelStream().map(...).collect(...); long duration = (System.nanoTime() - start) / 1_000_000; System.out.println("并行处理耗时: " + duration + " ms");

七、适用场景

  1. ‌大数据集处理‌

  2. ‌计算密集型操作‌

  3. ‌无状态、无顺序要求的操作‌

  4. ‌可分割的数据源‌

并行流是Java 8中强大的数据处理工具,合理使用可以显著提高性能,但需要根据具体场景谨慎选择。

Java9

‌1. 模块系统(JPMS)‌

‌理解‌:将代码组织成模块,明确依赖关系和访问控制,解决JAR地狱问题。
‌用法‌:在项目根目录创建module-info.java文件。
‌示例‌:

// module-info.java
module com.example.myapp {
    requires java.base;       // 依赖基础模块
    requires java.sql;        // 依赖SQL模块
    exports com.example.util; // 导出包供其他模块使用
}

2. JShell(REPL工具)‌

‌理解‌:交互式命令行工具,直接执行Java代码片段。
‌用法‌:命令行输入jshell,直接输入表达式或代码。
‌示例‌:

jshell> int x = 10;
jshell> System.out.println(x * 2);
20

3. 集合工厂方法‌

‌理解‌:快速创建不可变集合(List、Set、Map)。
‌用法‌:List.of()、Set.of()、Map.of()。
‌示例‌:

List<String> names = List.of("Alice", "Bob", "Charlie");
Set<Integer> numbers = Set.of(1, 2, 3);
Map<String, Integer> scores = Map.of("Alice", 90, "Bob", 85);

‌4. 接口私有方法‌

‌理解‌:接口中可定义私有辅助方法,减少代码重复。
‌用法‌:在接口中使用private修饰方法。
‌示例‌:

interface Logger {
    default void logInfo(String message) {
        log(message, "INFO");
    }
    private void log(String message, String level) {
        System.out.println(level + ": " + message);
    }
}

5. 改进的Stream API‌

‌理解‌:新增takeWhile、dropWhile等方法,增强流控制。
‌用法‌:结合Stream操作。
‌示例‌:

List<Integer> numbers = List.of(1, 2, 3, 4, 5);
List<Integer> result = numbers.stream()
    .takeWhile(n -> n < 4) // 取元素直到条件不满足
    .collect(Collectors.toList()); // [1, 2, 3]

‌6. 多版本兼容JAR‌

‌理解‌:同一JAR包支持不同Java版本的类文件。
‌用法‌:在MANIFEST.MF中指定Multi-Release: true,目录结构为:

META-INF/versions/9/com/example/MyClass.class

‌7. 改进的Optional‌

‌理解‌:新增ifPresentOrElse、or等方法。
‌用法‌:更灵活处理空值。
‌示例‌:

Optional<String> name = Optional.ofNullable(getName());
name.ifPresentOrElse(
    System.out::println,
    () -> System.out.println("Name not found")
);

9. 进程API改进‌

‌理解‌:更强大的进程管理和信息获取。
‌用法‌:通过ProcessHandle获取进程信息。
‌示例‌:

ProcessHandle.current().pid(); // 获取当前进程ID
ProcessHandle.allProcesses()   // 列出所有进程
    .filter(p -> p.info().command().orElse("").contains("java"))
    .forEach(p -> System.out.println(p.pid()));

10. 响应式流(Flow API)‌

‌理解‌:支持响应式编程的标准接口(Publisher/Subscriber)。
‌用法‌:实现背压控制的异步数据流。
‌示例‌:

SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
publisher.subscribe(new Subscriber<>() {
    public void onSubscribe(Subscription s) { s.request(1); }
    public void onNext(String item) { System.out.println(item); }
    public void onError(Throwable t) { t.printStackTrace(); }
    public void onComplete() { System.out.println("Done"); }
});
publisher.submit("Hello");

Java10

1. 局部变量类型推断(var)‌

‌理解‌:允许开发者用var声明局部变量,编译器自动推断类型(仅限局部变量,非字段或方法参数)。
‌用法‌:var variable = value;
‌示例‌:

// 传统写法
List<String> names = new ArrayList<>();

// Java 10简化
var names = new ArrayList<String>();
var stream = names.stream(); // 自动推断为Stream<String>

‌2. 不可变集合的增强(CopyOf)‌

‌理解‌:List.copyOf()、Set.copyOf()等方法快速创建不可变集合副本。
‌用法‌:基于现有集合生成不可变副本。
‌示例‌:

List<String> original = List.of("A", "B");
List<String> copy = List.copyOf(original); // 不可变副本

‌3. Optional.orElseThrow()‌

‌理解‌:Optional新增无参方法,语义等同于get()但更直观。
‌用法‌:替代get(),明确表示可能抛出异常。
‌示例‌:

Optional<String> name = Optional.ofNullable(getName());
String result = name.orElseThrow(); // 若为null抛出NoSuchElementException

‌4. 并行全垃圾回收器(G1)‌

‌理解‌:G1垃圾回收器在Full GC时改为并行处理,减少停顿时间。
‌用法‌:无需代码调整,JVM自动优化(需启用G1:-XX:+UseG1GC)。

‌5. 线程本地握手(Thread-Local Handshake)‌

‌理解‌:允许在不暂停所有线程的情况下执行线程回调,提升JVM调试和控制能力。
‌用法‌:JVM内部特性,开发者无需直接干预。

‌6. 根证书认证‌

‌理解‌:JDK默认包含CA根证书,支持TLS安全通信。
‌用法‌:自动生效,如HttpsURLConnection无需手动配置证书。

‌7. 应用类数据共享(AppCDS)‌

‌理解‌:扩展类数据共享至应用类,加速启动时间。
‌用法‌:需两步操作:

  1. 生成共享存档:java -Xshare:dump
  2. 运行应用时加载:java -Xshare:on MyApp

‌8. 基于时间的版本号‌

‌理解‌:版本号改为基于发布周期(如10.0.1),非之前的1.8.0_291格式。


‌总结‌

  • ‌核心特性‌:var局部变量类型推断是开发者最直接可用的特性。
  • ‌性能优化‌:G1并行化和AppCDS提升运行时效率。
  • ‌安全增强‌:根证书支持开箱即用的TLS安全。
  • ‌不可变集合‌:copyOf()方法简化防御性编程。

Java11

‌1. HTTP Client API(正式版)‌

‌理解‌:标准化Java 9引入的HTTP/2客户端,支持同步/异步请求。

‌用法‌:通过HttpClient发送请求,支持链式调用。

‌示例‌:

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://example.com"))
    .GET()
    .build();
// 同步请求
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

// 异步请求
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
    .thenApply(HttpResponse::body)
    .thenAccept(System.out::println);

‌2. 局部变量类型推断增强(var for Lambda参数)‌

‌理解‌:允许在Lambda表达式中使用var声明参数(需显式注解@NonNull等)。
‌用法‌:需结合注解使用。
‌示例‌:

List<String> names = List.of("Alice", "Bob");
names.forEach((@NonNull var name) -> System.out.println(name));

‌3. 字符串增强方法‌

‌理解‌:新增isBlank()、lines()、repeat()等方法。
‌用法‌:

String str = "  ";
System.out.println(str.isBlank()); // true

String multiLine = "A\nB\nC";
multiLine.lines().forEach(System.out::println); // 逐行输出

String repeated = "Java".repeat(3); // "JavaJavaJava"

4. 新的文件读写方法(Files类)‌

‌理解‌:Files.writeString()和Files.readString()简化文本文件操作。
‌用法‌:

Path path = Path.of("test.txt");
// 写入
Files.writeString(path, "Hello Java 11", StandardCharsets.UTF_8);
// 读取
String content = Files.readString(path);

‌5. 启动单文件源代码程序‌

‌理解‌:直接运行.java文件(无需先编译)。
‌用法‌:

# 直接运行(隐式编译)
java HelloWorld.java

‌6. Epsilon垃圾回收器‌

‌理解‌:无内存回收的GC,适用于性能测试或短生命周期应用。
‌用法‌:启动参数添加-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC。


‌7. 嵌套访问控制(Nest-Based Access Control)‌

‌理解‌:JVM内部优化,允许嵌套类直接访问彼此的私有成员。
‌示例‌:

class Outer {
    private void outerMethod() {}
    class Inner {
        void innerMethod() {
            outerMethod(); // Java 11允许直接访问
        }
    }
}

‌8. 动态类文件常量(JEP 309)‌

‌理解‌:JVM新增CONSTANT_Dynamic常量池类型,提升动态语言支持。


‌9. 移除模块和特性‌

‌理解‌:移除Java EE和CORBA模块(如javax.xml.ws),需手动添加依赖。


‌10. Flight Recorder(JFR)开源‌

‌理解‌:原商业版JFR成为开源功能,用于低开销性能监控。
‌用法‌:启动参数添加-XX:StartFlightRecording。

Java12-16

以下是Java 12到16的核心特性详解,按版本分类说明:


‌Java 12(2019年3月)‌

1. Switch表达式(预览)

‌理解‌:简化switch语法,支持返回值和多标签匹配。
‌用法‌:

int day = 3; String dayType = switch (day) { case 1, 2, 3, 4, 5 -> "Weekday"; case 6, 7 -> "Weekend"; default -> throw new IllegalArgumentException(); };

2. Shenandoah GC(实验性)

‌理解‌:低停顿时间的垃圾回收器,适合大堆内存应用。
‌用法‌:启动参数添加-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC。

3. Microbenchmark Suite(JMH集成)

‌理解‌:JDK内置微基准测试工具。
‌用法‌:通过jdk.test.lib.包编写性能测试。


‌Java 13(2019年9月)‌

1. 文本块(预览)

‌理解‌:简化多行字符串书写,避免转义符。
‌用法‌:

String json = """ { "name": "Java", "version": 13 } """;

2. 动态CDS归档

‌理解‌:优化类数据共享,减少启动时间。
‌用法‌:运行应用时添加-XX:ArchiveClassesAtExit=<file>。

3. Socket API重构

‌理解‌:底层NIO实现优化,提升性能。


‌Java 14(2020年3月)‌

1. instanceof模式匹配(预览)

‌理解‌:直接类型转换,减少冗余代码。
‌用法‌:

if (obj instanceof String s) { System.out.println(s.length()); // 直接使用s }

2. Record类(预览)

‌理解‌:简化不可变数据类的定义。
‌用法‌:

record Point(int x, int y) {} Point p = new Point(1, 2); System.out.println(p.x()); // 自动生成getter

3. NullPointerException增强

‌理解‌:明确提示NPE发生的具体变量。
‌输出示例‌:

Cannot invoke "String.length()" because "foo.bar" is null


‌Java 15(2020年9月)‌

1. 密封类(Sealed Classes,预览)

‌理解‌:限制类的继承关系。
‌用法‌:

public sealed class Shape permits Circle, Square {} final class Circle extends Shape {} final class Square extends Shape {}

2. 隐藏类(Hidden Classes)

‌理解‌:动态生成类且不暴露给外部,适合框架使用。

3. ZGC(生产就绪)

‌理解‌:可扩展低延迟GC,默认支持。
‌用法‌:-XX:+UseZGC。


‌Java 16(2021年3月)‌

1. Record类(正式版)

‌用法‌:同Java 14,移除preview标记。

2. 模式匹配instanceof(正式版)

‌用法‌:同Java 14,移除preview标记。

3. Stream.toList()快捷方法

‌理解‌:简化Stream转List操作。
‌用法‌:

List<String> list = Stream.of("a", "b").toList();

4. Unix域套接字通道

‌理解‌:支持本地进程间通信。
‌用法‌:通过java.nio.channels包操作。


‌总结‌

  • ‌语法糖‌:switch表达式、文本块、record类显著提升开发效率。
  • ‌性能优化‌:ZGC/Shenandoah GC适合低延迟场景。
  • ‌工具链‌:动态CDS和JMH增强调试能力。
  • ‌稳定性‌:Java 16将多项预览特性转为正式功能。

各版本均需通过--enable-preview启用预览特性(如Java 14的record)。生产环境推荐使用LTS版本(如Java 11/17)。

Java17

1. 密封类(Sealed Classes,正式版)‌

‌理解‌:限制类的继承关系,明确声明哪些类可以继承或实现它。
‌用法‌:

public sealed class Shape permits Circle, Square { // 父类定义 } final class Circle extends Shape {} // 允许的子类 final class Square extends Shape {} // 允许的子类


‌2. 模式匹配instanceof(正式版)‌

‌理解‌:简化类型检查和类型转换,减少冗余代码。
‌用法‌:

if (obj instanceof String s) { System.out.println(s.length()); // 直接使用s }


‌3. 文本块(正式版)‌

‌理解‌:多行字符串无需转义,保留原始格式。
‌用法‌:

String json = """ { "name": "Java", "version": 17 } """;


‌4. Switch表达式增强(正式版)‌

‌理解‌:支持箭头语法和返回值,避免break漏写问题。
‌用法‌:

String dayType = switch (day) { case 1, 2, 3 -> "Weekday"; case 6, 7 -> "Weekend"; default -> "Unknown"; };


‌5. 新的垃圾回收器(ZGC/Shenandoah GC)‌

‌理解‌:

  • ‌ZGC‌:低延迟GC(默认支持),最大停顿时间<1ms。
  • ‌Shenandoah‌:低停顿GC,适合大堆内存。
    ‌用法‌:启动参数添加:
  • ZGC: -XX:+UseZGC
  • Shenandoah: -XX:+UseShenandoahGC

‌6. 移除实验性AOT和JIT编译器‌

‌理解‌:移除GraalVM的实验性支持,需单独安装GraalVM使用。


‌7. 外部函数和内存API(孵化器模块)‌

‌理解‌:替代JNI,安全调用本地代码(如C/C++)。
‌用法‌(需启用孵化模块):

import jdk.incubator.foreign.*; try (MemorySegment segment = MemorySegment.allocateNative(100)) { // 操作本地内存 }

运行命令:java --add-modules jdk.incubator.foreign ...


‌8. 伪随机数生成器(新API)‌

‌理解‌:提供更灵活的随机数生成器(如RandomGenerator)。
‌用法‌:

RandomGenerator generator = RandomGenerator.getDefault(); int randomNum = generator.nextInt(100);


‌9. 弃用Applet API‌

‌理解‌:彻底移除对Java Applet的支持。

‌10. 强封装JDK内部API‌

‌理解‌:默认禁止反射访问JDK内部API(如sun.misc),需通过--add-opens显式授权。


‌总结‌

  • ‌语法增强‌:密封类、模式匹配、文本块显著提升代码简洁性。
  • ‌性能工具‌:ZGC/Shenandoah GC适合高吞吐或低延迟场景。
  • ‌兼容性‌:注意强封装和移除特性对旧项目的影响。
  • ‌生产推荐‌:Java 17是LTS版本,建议优先采用。

Java18-20

以下是Java 18到20的核心特性详解,按版本分类说明:


‌Java 18(2022年3月)‌

1. 默认UTF-8字符集

‌理解‌:所有Java API默认使用UTF-8编码,避免跨平台乱码问题。
‌用法‌:无需额外配置,String.getBytes()等操作默认按UTF-8处理。

2. 简易Web服务器(jwebserver)

‌理解‌:内置命令行工具,快速启动静态文件服务器。
‌用法‌:

jwebserver -p 8000 -d /path/to/files

3. 模式匹配增强(第二次预览)

‌理解‌:支持switch中的模式匹配和类型推断。
‌用法‌:

Object obj = "Java"; switch (obj) { case String s -> System.out.println(s.length()); case Integer i -> System.out.println(i * 2); default -> {} }


‌Java 19(2022年9月)‌

1. 虚拟线程(预览)

‌理解‌:轻量级线程(协程),大幅提升并发性能。
‌用法‌:

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { executor.submit(() -> System.out.println("Virtual Thread")); }

2. 结构化并发(孵化器)

‌理解‌:简化多线程任务的生命周期管理。
‌用法‌:

try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { Future<String> future = scope.fork(() -> "Result"); scope.join(); System.out.println(future.resultNow()); }

3. 外部函数与内存API(第三次预览)

‌理解‌:替代JNI的安全本地代码调用(同Java 17)。


‌Java 20(2023年3月)‌

1. 记录模式(Record Patterns,预览)

‌理解‌:解构record类的值,类似模式匹配。
‌用法‌:

record Point(int x, int y) {} Point p = new Point(1, 2); if (p instanceof Point(int x, int y)) { System.out.println(x + "," + y); // 输出: 1,2 }

2. 虚拟线程(第二次预览)

‌用法‌:同Java 19,优化了性能。

3. Scoped Values(孵化器)

‌理解‌:线程内共享不可变数据,替代ThreadLocal。
‌用法‌:

final static ScopedValue<String> USER = ScopedValue.newInstance(); ScopedValue.runWhere(USER, "Alice", () -> { System.out.println(USER.get()); // 输出: Alice });


‌总结‌

  • ‌并发革命‌:虚拟线程(Java 19+)是最大亮点,适合高并发场景。
  • ‌语法糖‌:记录模式(Java 20)和模式匹配持续增强代码简洁性。
  • ‌工具链‌:jwebserver(Java 18)方便开发测试。
  • ‌实验特性‌:结构化并发和Scoped Values需谨慎评估。

所有预览特性需通过--enable-preview启用,例如:

javac --release 20 --enable-preview Main.java java --enable-preview Main

Java 17仍是当前推荐的生产环境LTS版本,新特性建议在非关键项目试用。

Java21

以下是Java 21(2023年9月发布,LTS版本)的核心特性详解,包含理解、用法和代码示例:


‌1. 虚拟线程(正式版)‌

‌理解‌:轻量级线程(协程),由JVM管理而非操作系统,可创建数百万个线程而不会耗尽资源。
‌用法‌:

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { executor.submit(() -> System.out.println("Hello from virtual thread"));

}


‌2. 记录模式(Record Patterns,正式版)‌

‌理解‌:解构record类的值,结合instanceof或switch使用。
‌用法‌:

record Point(int x, int y) {}

Point p = new Point(1, 2);

if (p instanceof Point(int x, int y)) {

System.out.println(x + "," + y); // 输出: 1,2

}


‌3. 模式匹配switch(正式版)‌

‌理解‌:switch支持类型匹配和复杂条件判断。
‌用法‌:

Object obj = "Java";

String result = switch (obj) {

case Integer i -> "Number: " + i;

case String s when s.length() > 3 -> "Long string";

case String s -> "String: " + s;

default -> "Unknown";

};


‌4. 字符串模板(预览)‌

‌理解‌:简化字符串拼接,支持内嵌表达式。
‌用法‌(需--enable-preview):

String name = "Java";

String message = STR."Hello \{name}!"; // 输出: Hello Java!


‌5. 分代ZGC(正式版)‌

‌理解‌:ZGC新增分代垃圾回收,降低年轻代回收开销。
‌用法‌:启动参数添加-XX:+UseZGC -XX:+ZGenerational。


‌6. 有序集合(Sequenced Collections)‌

‌理解‌:为集合(如List、Deque)添加统一的首尾操作API。
‌用法‌:

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

list.addFirst("First"); // 添加到开头

list.getLast(); // 获取末尾元素


‌7. 外部函数与内存API(正式版)‌

‌理解‌:替代JNI的安全本地代码调用。
‌用法‌:

try (Arena arena = Arena.ofConfined()) {

        MemorySegment segment = arena.allocate(100);

        segment.set(ValueLayout.JAVA_INT, 0, 42); // 写入数据

}


‌8. 弃用Windows 32位安装包‌

‌理解‌:不再提供32位Windows的JDK安装包。


‌9. 密钥封装机制API(KEM)‌

‌理解‌:支持量子安全的加密算法(如RSA-KEM)。
‌用法‌:

KeyPairGenerator kpg = KeyPairGenerator.getInstance("X25519");

KeyPair kp = kpg.generateKeyPair();

KEM kem = KEM.getInstance("DHKEM");

KEM.Encapsulated e = kem.encapsulate(kp.getPublic());

byte[] secret = e.secret(); // 共享密钥


‌总结‌

  • ‌并发革命‌:虚拟线程是核心特性,适合高并发微服务。
  • ‌语法增强‌:记录模式、模式匹配switch提升代码简洁性。
  • ‌安全与性能‌:分代ZGC和KEM API强化安全与效率。
  • ‌预览特性‌:字符串模板需手动启用预览功能。

生产环境推荐Java 21(LTS),预览特性需通过以下参数启用:

javac --release 21 --enable-preview Main.java java --enable-preview Main

从JDK 17到JDK 21:Java核心特性概述 引言从2021年的JDK 17到2023年的JDK 21,Java完成了多项革命性改进。作为两个长期支持版本(LTS),它们代表了现代Java开发的核心方向。本文将对比分析这五年间的重要更新,通过代码实例揭示版本升级带来的开发效率与性能提升。 阅读详情

相关推荐

如何用SPSS做logistic回归

详细到只有作者本人能看懂的SPSS逻辑回归育儿经

qq_44794961的博客 2万+

一口气读完 Java 8 ~ Java 21 所有新特性

大家好,我是大明哥,一个专注「」系列创作的硬核程序员。。Java 现在发布的版本很快,每年两个,但是真正会被大规模使用的是 3 年一个的 LTS 版本。在 Java 版本中,一个特性的发布都会经历孵化阶段、预览阶段和正式版本。其中孵化和预览可能会跨越多个 Java 版本。

chenssy 的技术博客 9435

【TC3xx芯片】TC3xx芯片电源管理系统PMS详解

本文主要介绍了TC3xx芯片的电源管理系统(PMS),重点探讨了供电模式选择、电源监控机制及电源管理模式。文章首先分析了4种供电模式及其硬件配置方式,详细说明了3.3V单电源供电模式的特点;其次阐述了Primary和Secondary两种电源监控机制,包括阈值配置和异常中断处理;最后重点讲解了CPU和系统的电源管理模式,特别对Standby模式及其进入/退出条件进行了详细说明。文章以软件开发视角解析了TC3xx芯片的电源管理功能,为ECU低功耗设计提供了技术参考。

redparrot2008的博客 1526

从JDK8到JDK21,引入的新特性列表

这是最引人注目的特性之一,它允许你以更简洁的方式编写匿名函数。Lambda表达式使得函数式编程风格在Java中成为可能,特别适用于集合操作和事件监听器等场景。

weixin_37641863的博客 1606

Silvaco Atlas入门指南——从零开始掌握半导体器件仿真

本文为Silvaco Atlas半导体器件仿真软件的入门指南,详细介绍了从零开始掌握该工具的核心流程。内容涵盖Atlas的基本概念、仿真流程、核心文件(输入、结构、输出文件)、交互式与批处理两种操作模式,并逐步演示了如何从定义网格、划分区域、设置电极到进行掺杂、选择物理模型并求解,最终获取和分析器件特性的完整步骤。旨在帮助微电子相关专业人员和工程师快速上手这一强大的“数字实验室”,提升半导体器件设计与研发效率。

weixin_29306317的博客 401

AOA(Angle of Arrival,到达角)定位算法及其误差分析的原理和MATLAB仿真_aoa定位算法

如图所示,有基站 S 1 ( x 1 , y 1 , z 1 ) , S 2 ( x 2 , y 2 , z 2 ) S_1(x_1,y_1,z_1),S_2(x_2,y_2,z_2) S1​(x1​,y1​,z1​),S2​(x2​,y2​,z2​),目标 T ( x , y , z ) T(x,y,z) T(x,y,z)。2+(z_1-z_2)^2} step1:两基站间的距离L=(x1−x2)2+(y1​−y2​)2+(z1​−z2​)2。

2401_87555613的博客 1482

【工作记录】JDK8到JDK21都更新了哪些新特性

本文整理了jdk8-jdk21各个版本的新特性信息,并给出了一些简单示例。

泽济天下的专栏 3132

Comsol超声空化气泡仿真:从基础理论到工业应用实践

本文详细介绍了Comsol超声空化气泡仿真的基础理论及工业应用实践。通过解析超声空化现象、Comsol模型搭建流程及求解器优化技巧,帮助工程师掌握气泡仿真技术,提升超声波清洗和乳液制备等工业应用的效率与质量。

weixin_27966471的博客 251

JDK新特性(8-21)数据类型-直接内存

例如,当容器的 CPU 或内存资源被重新分配时,Java 应用能够及时调整自身的性能和资源消耗策略,保证应用的稳定运行。例如,对于对象的内存分配机制进行了调整,减少了内存碎片的产生,提高了内存的利用率。例如,record Point(int x, int y) {}定义了一个记录类,它有x和y两个属性,可以通过new Point(1, 2)来创建实例,并且可以直接访问x和y属性。例如,在网络通信加密、数据存储加密等场景下,可以利用这些新的 API 来提高应用程序的安全性,保护用户数据。

sv 1437

PCB设计之ODB++文件格式详解

ODB++(Open Database++)是一种广泛应用于PCB(印制电路板)设计和制造领域的开放数据交换格式。它由Valor Computerized Systems(现为Siemens EDA的一部分)开发,旨在替代传统的Gerber文件格式,提供更完整、结构化的制造数据,从而优化PCB设计到生产的流程。ODB++通过结构化数据整合了PCB设计到制造的全流程信息,显著提高了生产效率和准确性。尽管存在一定的兼容性挑战,但其在复杂项目和高可靠性场景中的价值不可替代。

ZZcppc的博客 1万+

(二)使用VS2022克隆下载C++自制植物大战僵尸游戏教程

本文将介绍如何使用VS2022克隆下载《植物大战僵尸C++自制版本》。Gitee项目地址:Gitee仓库地址Github项目地址:Github仓库地址游戏官网地址(下载可直接运行)游戏官网。

尔灵尔亿的博客 4929

jdk8、jdk17、jdk21有哪些新特性

本文对比分析了Java JDK8、17和21三个LTS版本的核心特性演进。JDK8(2014)引入Lambda表达式、Stream API和Optional类,奠定了函数式编程基础;JDK17(2021)带来密封类、模式匹配、记录类和ZGC优化,提升了安全性和性能;JDK21(2023)正式推出虚拟线程、序列集合和分代ZGC,显著增强了并发处理能力和内存管理。版本演进呈现三大趋势:函数式编程持续深化、安全性控制不断加强、并发性能大幅提升。建议历史项目保持JDK8,平衡选择JDK17,追求高性能采用JDK21

cxbtdd的博客 1686

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

10万字总结Java8到21新特性详解

Java 17,发布于 2021 年 9 月,是一个长期支持(LTS)版本。Java 18,于2022年3月发布。Java 19, 于2022-09-20 发布众所周知,JVM 是一个多线程环境,它通过为我们提供了对操作系统线程的抽象,但是 Java 中的线程都只是对操作系统线程的一种简单封装,我们可以称之为“平台线程”。代价昂贵:创建平台线程的成本很高。每当创建一个平台线程时,操作系统都必须在堆栈中分配大量内存来存储线程的上下文、原生调用堆栈和 Java 调用堆栈。

qq_43842093的博客 2339

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java 进化之路:从 Java 8 到 Java 21 的重要新特性

从Java8到Java21系列新特性开篇介绍

驴大毛的博客 1535

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

从JDK 8到21:核心特性深度解读与实战指南

Lambda表达式是JDK 8最重要的特性,允许将代码块作为参数传递,从而更方便地使用函数式编程风格,简化匿名内部类的写法。虚拟线程是Java轻量级线程实现,极大降低线程创建和切换成本,支持成千上万甚至数十万线程的并发,简化高并发编程。JDK 21引入分代ZGC,是ZGC的升级版,结合了分代收集和低延迟优势,提高GC效率,减少暂停时间。包裹多行字符串,支持保留格式,简化多行字符串的书写,特别适合HTML、JSON等格式。的模式匹配,允许在判断对象类型的同时定义变量,简化代码。

qq_41323045的博客 1218

Java 8至Java 24核心特性总结

《Java演进全貌:从语言革新到性能突破(Java 8-24)》 本文系统梳理Java近十年的核心演进,涵盖五大维度技术突破: 语言范式:函数式编程(Lambda/Stream)、模块化系统、记录类/密封类等现代语法 并发模型:虚拟线程实现百万级并发、结构化并发管理任务生命周期 垃圾收集:ZGC/Shenandoah实现亚毫秒停顿,支持TB级堆内存 硬件加速:Vector API利用SIMD指令提升8-15倍计算性能 工具生态:JShell交互编程、JFR实时诊断等开发体验优化 每项革新均提供典型代码示例,

码到三十五 2884

Java 8、17、21:核心特性与升级指南

Java 8、17 和 21 是三个重要的 LTS 版本,各具特色。Java 8 引入了 Lambda、Stream API 等函数式编程特性,成为现代化 Java 的起点。Java 17 增强了语法简洁性,新增记录类、模式匹配等特性,并优化了垃圾回收性能。Java 21 则带来革命性的虚拟线程、结构化并发和分代 ZGC,大幅提升高并发和大规模应用的性能。建议根据项目需求升级:Java 17 适合稳定性和现代化语法需求,Java 21 更适合高性能应用开发。升级时需注意依赖库兼容性和代码重构。

果子的技术分享 1355

JDK21 vs JDK8 新特性

摘要: JDK 21作为最新LTS版本,相比JDK 8实现了全面革新。核心差异包括: 语言特性:新增虚拟线程(百万级轻量级并发)、结构化并发、记录模式(深度解构对象)及增强的模式匹配(switch/instanceof); 性能优化:ZGC低延迟垃圾回收、向量API(SIMD加速计算)、紧凑字符串存储; 开发体验:简化单文件程序(无类名main方法)、标准HTTP客户端、字符串模板(类似f-string); 安全性:强制封装内部API、默认TLS 1.3加密; 移除内容:Applet、RMI激活等老旧功能。

csdn_tom_168的博客 3235

Java 8 到 Java 21:Lambda、Stream 与新特性实战指南

本文系统梳理了Java 8至Java 21的核心演进,聚焦函数式编程、高并发与高性能特性。从Java 8的Lambda表达式、Stream API和Optional,到Java 9-11的模块化系统和语法改进,再到Java 14-17的Record类型和模式匹配,最后到Java 21的虚拟线程。通过代码示例与最佳实践,为开发者提供了一份现代Java开发指南,涵盖Lambda、Stream、Optional、模块化、Record、模式匹配和虚拟线程等关键特性,帮助开发者掌握Java的现代化转型路径。

刘一说的IT专栏 1217

Java21特性解读

当前JDK的版本已经到了23了,不过最近的LTS版本是21,刚好最近准备把直播侧serverless应用的JVM环境升级到java21(目前是11),在升级前对21的特性做一个简单的了解和熟悉,下面是个人熟悉过程中的笔记,大家可以按照每一节特性中的代码自己在本地run下,可以更快地做个了解。JDK的版本其实最近几年开始,已经是6个月一个版本了,LTS版本大概差不多间隔4-6个版本(不定),每次升级...

淘系技术 1598

【Java】新特性演进:从JDK 8到JDK 21

Java版本演进与核心特性摘要 本文全面梳理了Java从JDK 8到JDK 21的主要版本演进与核心特性: 版本概览:重点介绍了JDK 8、11、17、21四个LTS版本的核心特性与生命周期 JDK 8革命性特性: Lambda表达式实现函数式编程 Stream API提供声明式集合操作 Optional优雅处理空指针 全新DateTime API解决日期时间问题 JDK 11现代化改进: var局部变量类型推断 标准HTTP Client API 字符串处理增强方法 JDK 17类型安全: Records

瘦到被风吹走的博客 1997

Java 进化之路:从 Java 8 到 Java 21 的重要新特性(技术人必看指南)

从 Java 8 到 Java 21,我们看到的不仅是语法的改进,更是一种编程范式的进化(函数式、并发模型、内存管理)。至少掌握两个 LTS 版本的特性差异,这是保持技术竞争力的关键!还在用 Java 8 的小伙伴们(别假装没看到),是时候考虑升级了!毕竟…「世界上只有两种 Java:正在升级的 Java,和需要升级的 Java」

matlab888999的博客 1154

Java 8到Java 24:核心特性介绍

Java语言自Java 8以来经历了显著的演变,每一步都在提升开发效率、运行性能和代码可维护性。从函数式编程到模块化系统,从G1垃圾收集器到ZGC,从Lambda表达式到虚拟线程,从传统标量计算到Vector API的SIMD并行计算,Java不断适应现代软件开发的需求。理解这些特性的实现原理和技术细节,不仅有助于更好地应用它们,还能帮助开发者做出更明智的技术选择,平衡创新与稳定性,为组织创造更大的价值。无论是构建微服务、云原生应用还是高性能计算系统,现代Java都能提供强大而灵活的解决方案。

(づ ̄ 3 ̄)づxl 1565

Java进化之路:从Java 8到Java 21的重要新特性(深度技术剖析)

(认真脸)最近三年Java平均每半年发布一个新版本,从2014年的Java 8到2023年的Java 21,Oracle已经给我们塞了整整。这个被戏称为"Java最大的架构革命"的特性,彻底解决了JAR地狱问题。的典范,让集合操作从"怎么做"变成了"做什么"。现在就从Java 17开始尝试,等Java 21 LTS版本发布直接上车,保证让你的编程体验焕然一新!配合方法引用(::操作符)使用效果更佳,但要注意避免过度简化导致可读性下降(血泪教训)。但要注意开头的"""必须单独成行(踩过坑的举手)。

debugdynamo的博客 1130

JDK 8、17与21特性总结:版本特性、区别与适用场景对比

JDK 8、17与21特性总结:版本特性、区别与适用场景对比 JDK 是 Java 开发的核心,每个版本的更新都带来了新的特性和优化,今天就为大家总结 JDK 8、17 与 21 的关键特性与区别! 从 JDK 8 的函数式编程到 JDK 17 的长期支持(LTS),再到 JDK 21 的最新性能优化,选择适合的 JDK 版本是开发者必须掌握的技能。本文将从以下方面为你全面解析: 每个版本的主要特性与亮点 🚀 它们的核心区别与技术优化方向 不同应用场景下的版本选择建议 通过本篇文章,你将深

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 2592
上一篇: RocketMQ的进阶问题
下一篇: CompletableFuture 深度解析
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值