java11特性总结回顾

java11相较于java8的特性总结回顾

语法或语言增强

局部变量类型推断 (var)

  • Java 10 引入了 var 关键字,Java 11继续支持。
  • 允许在声明局部变量时省略显式的类型,由编译器根据初始化表达式自动推断类型。
  • 注意:var 声明的仍然是静态类型变量,不是动态类型。
    示例:
var list = new ArrayList<String>(); // 推断为 ArrayList<String>
var stream = list.stream();         // 推断为 Stream<String>
  • 限制:不能用于初始化为 null 的变量、没有初始化的变量、方法参数、lambda表达式参数(但Java 11支持在lambda参数中使用var)等。

Lambda表达式中使用 var

Java 11 允许在Lambda表达式的参数中使用 var,并且可以为这些参数添加注解。
示例:

Predicate<String> predicate = (@NonNull var a) -> a.length() > 0;

API增强

String 类增强

  • isBlank(): 判断字符串是否为空白(空字符串或仅包含空白字符)。
  • lines(): 返回一个 Stream,将字符串按行分割(基于换行符)。
  • strip(), stripLeading(), stripTrailing(): 新的去除空白字符的方法,比 trim() 更智能,能正确处理Unicode空白字符。
  • repeat(int count): 将字符串重复指定次数并返回新字符串。
    示例:
"  ".isBlank(); // true
"Hello\nWorld".lines().count(); // 2
"  Java  ".strip(); // "Java"
"Hi".repeat(3); // "HiHiHi"

Collection 接口增强

  • List.of(), Set.of(), Map.of(): 静态工厂方法,用于创建不可变的集合。语法简洁,避免了使用 Collections.unmodifiableXxx() 的繁琐。
  • List.copyOf(), Set.copyOf(), Map.copyOf(): 创建指定集合的不可变副本。
    示例:
var list = List.of("a", "b", "c");
var copy = List.copyOf(list);

Stream API 增强

  • Stream.ofNullable(T t): 创建一个包含单个元素的流,如果元素为 null,则创建一个空流。这简化了对可能为 null 的值进行流处理的代码。
  • takeWhile(Predicate predicate): 对于有序流,从开始起保留满足条件的元素,一旦遇到不满足条件的元素,就停止。
  • dropWhile(Predicate predicate): 对于有序流,从开始起丢弃满足条件的元素,一旦遇到不满足条件的元素,就停止。
    示例:
Stream.of(1, 2, 3, 4, 5, 4, 3, 2, 1)
      .takeWhile(x -> x < 3); // [1, 2]
Stream.of(1, 2, 3, 4, 5, 4, 3, 2, 1)
      .dropWhile(x -> x < 4); // [4, 5, 4, 3, 2, 1]

Optional 类增强

  • isEmpty(): 与 isPresent() 相反,判断 Optional 是否不包含值。这使得条件判断更自然。
    示例:
 if (optional.isEmpty()) { ... }

InputStream 新增 transferTo() 方法

  • 将 InputStream 中的所有字节直接传输到 OutputStream,简化了流复制操作。
    示例:
inputStream.transferTo(outputStream);

HTTP Client API (标准版)

  • 背景:该API在Java 9中作为孵化器模块引入,在Java 11中正式成为标准库的一部分(java.net.http包)。
  • 功能:提供了一个现代化的、支持HTTP/2和WebSocket的HTTP客户端。
  • 特点:
    • 支持同步和异步(非阻塞)请求。
    • 使用构建器(Builder)模式,API设计更清晰。
    • 原生支持HTTP/2协议,提升性能。

示例

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(URI.create("https://example.com")).build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

文件操作

  • 单文件源码执行
    • Java 11允许直接使用 java 命令运行单个Java源代码文件,无需先使用 javac 编译。
    • 示例:java HelloWorld.java (HelloWorld.java是一个包含main方法的类)。

性能与JVM改进

  • ZGC (Z Garbage Collector)
    • 在Java 11中作为实验性功能引入(通过 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC 启用)。
    • 目标是实现极低的暂停时间(<10ms),即使在处理非常大的堆内存(TB级别)时也能保持高吞吐量。
  • Epsilon GC
    • 一个“无操作”的垃圾收集器,用于性能测试和内存压力分析。它不执行任何垃圾回收,当堆内存耗尽时,JVM会退出。

工具与命令行

  • jdeps 工具增强,支持分析模块路径上的JAR文件。
  • jlink 工具(在Java 9引入)可以创建自定义的、更小的运行时镜像,减少部署体积。

移除的内容

  • 移除了Java EE和CORBA模块(如JavaFX也从JDK中移除,但作为独立项目继续发展)。
  • 移除了Applet API(java.applet),因为Applet技术已被废弃。

总结

Java 11在Java 8的基础上,通过引入var、增强的String/Collection/Stream API以及标准的HTTP Client等特性,进一步提升了开发效率和代码的可读性。虽然没有像Java 8那样带来革命性的编程范式转变(如Lambda),但它在API层面的累积改进非常实用。同时,ZGC等新垃圾收集器的引入,也为处理大规模应用和低延迟场景提供了新的选择。从Java 8升级到Java 11,不仅能获得新特性,还能享受性能提升和更现代的工具链。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值