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,不仅能获得新特性,还能享受性能提升和更现代的工具链。
15万+

被折叠的 条评论
为什么被折叠?



