Java 11 新特性与功能:深入了解长期支持版本的亮点
Java 11 新特性与功能:深入了解长期支持版本的亮点
概述
Java 11,作为一个长期支持版本(LTS),在2018年9月发布。它引入了许多新特性和,为开发者提供了更多的工具和选项。在本文中,我们将探讨 11的主要新特性,以及何在实际项目中应用这些特性。以下是Java 11中值得关注的新特性和新功能:
-
HTTP 客户端 API:Java 11引入了一组标准的HTTP客户端API,可以方便地创建和发送HTTP请求,并支持异步和流式处理。使用这个API可以替换HttpURLConnection和Apache HttpClient等传统的HTTP客户端工具。
-
var 关键字:var 是Java 10中引入的关键字,Java 11又扩展了它的使用范围。现在可以在Lambda表达式的参数列表中使用 var 来声明变量类型,并且可以在for循环中使用 var 来遍历数组或集合。
-
集合 API 增强:Java 11中的集合API有一些新增的方法和功能,例如 List.of()、Set.of() 和 Map.of() 可以快速创建不可变的集合。另外,新增了 Collection.toArray(IntFunction
generator) 方法,用于生成指定类型的数组。 -
ZGC 垃圾回收器:Java 11中引入了全新的ZGC垃圾回收器,它是一个低停顿的、可扩展的、并行的垃圾回收器,可以处理TB级别的堆内存。相比其他垃圾回收器,ZGC 能够更好地平衡吞吐量、延迟和内存占用。
-
Epsilon 垃圾回收器:Epsilon 是Java 11中引入的一种新的垃圾回收器,它不执行实际的垃圾回收操作,仅仅负责对内存进行分配和释放。因此,Epsilon 可以用于那些内存使用频繁,但是不需要垃圾回收的场景。
-
Unicode 10 支持:Java 11支持Unicode 10字符集,可以支持更多的字符和符号,包括 Emoji 和各种符号等。
-
新版Javadoc:Java 11中改进了Javadoc工具,使其更加易读和易用。新版Javadoc增强了搜索和导航功能,并且支持HTML5和CSS3等最新的Web技术。
-
Flight Recorder API:Java 11中引入了Flight Recorder API,可以在运行时收集应用程序的性能数据和事件,并将其输出到文件。这个API基于Java Mission Control(JMC),可以帮助开发人员分析和调试Java应用程序。
-
嵌套访问控制:Java 11中引入了嵌套访问控制,可以让内部类和外部类之间共享私有成员。如果一个类是另一个类的嵌套类,并且它们在同一个源代码文件中,那么它们之间可以互相访问私有成员。
-
废弃的API:Java 11中废弃了一些API,主要是Java EE 和 CORBA 相关的API,包括 java.corba、java.transaction、javax.enterprise 和 javax.jms 等。
这些仅是Java 11中的一部分新特性和功能,还有很多其他的更新,如新增的加密算法、新增的安全和性能增强等。
1. 嵌套于访问控制的上下文(Nest-Based Access Control)
Java 11通过JEP 181引入了嵌套类之间更简洁的访问控制。这个特性通过引入新的字节码指令,使得嵌套类之间的访问更加高效。这意味着在Java 11中,嵌套类可以直接访问彼此的私有成员,而无需使用桥接方法。
使用方法:
public class OuterClass { private int outerValue; public class InnerClass { private int innerValue; public int accessOuterValue() { return outerValue; // 直接访问外部类的私有成员 } } public int accessInnerValue(InnerClass inner) { return inner.innerValue; // 直接访问内部类的私有成员 }}
注意事项:
- 请确保您使用的编译器和运行时环境都支持Java 11,以充分利用这个特性。
2. 动态类文件常量(Dynamic Class- Constants)
Java 11通过JEP 309为常量池带来了一种新形式:动态常量。动常量允许在运行时析常量值,这使得类文件可以表示更丰富的常量表达式,同时保持紧凑和高效。
使用方法:
动态常量主要用于底层字节码操作和库开发。以下是一个使用invokedynamic
指令创建动态量的示例:
import java.lang.invoke.*;public class DynamicConstants { public static void main(String[] args) throws Throwable { MethodHandles.Lookup lookup = MethodHandles.lookup(); MethodType mt = MethodType.methodType(String.class, int.class); CallSite cs = (CallSite) lookup.findStatic(DynamicConstants.class, "bootstrap", mt).invoke(0); String result = (String) cs.getTarget().invoke(42); System.out.println(result); } public static CallSite bootstrap(MethodHandles.Lookup lookup, int value) { MethodHandle mh = lookup.findStatic(String.class, "valueOf", MethodType.methodType(String.class, int.class)); return new ConstantCallSite(mh); }}
注意事项:
- 动态常量主要用于高级开发场景,如库开发和字节码操作。在日常应用开发中,您可能不会直接使用这个特性。
3. 改进A64体系结构的支持
Java 11通过JEP 315改进了在Aarch64体系结构上的性能和稳定性。这个特性主要影响底层JVM实现。对于在Aarch64体系结构上运行Java应程序的开发者来说,这意味着更好的性能和稳定性。
注意事项:
- 如果的应用程序运行在arch64体系结构上,请确保使用Java 11或更高版本的JDK,以获得最佳性能和稳定性。
4. Epsilon垃圾收集器
Epsilon是一个实验性的垃圾收集器,它不执行任何内存回收操作。这个特性(JEP318)主要用于性能测试和调试。
使用方法:
要启用Epsilon垃圾收集,请在启动Java应用程序时添加JVM参数:
-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
注意事项:
- 请谨慎使用Epsilon垃圾收集器,因为它不会回收内存。在生产环境中使用E可能会导致内存泄漏和应用程序崩溃。
5. 移除Java EE和CORBA块
Java 11通过JEP 320移除了Java EE和CORBA相关的模块,以减小JDK的体积和复杂性。如果您的应用依赖于这些模块,您需要寻替代方案,例如使用独立的Java EE库。
注意事项:
- 在迁移到Java 11之前确保您的应用程序不依赖已移除的模块。您可能需要更新您的依赖库或寻找替代方案。
6. HTTP客户端(准)
Java 11引入了JEP 321,为开发者提供了一个新的HTTP客户端API,用于支持HTTP/1.1HTTP/2和WebSocket通信。这个API是在Java 9中引入的incubator模的基础上改进和标准化的。
方法:
以下是一个使用Java 11 HTTP客户端发送GET请求的示例:
import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;public class HttpClientExample { public static void main(String[] args) throws Exception { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://example.com")) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode()); System.out.println(response.body()); }}
注意事项:
- 在使用Java 11 HTTP客户端时,请确保您的应用程序已迁移到Java 11或更高版本的JDK。
7. 局部变量语法的改进(var)
Java 11通过JEP 323改进了局部变量类型推断(var),使其可以在lambda表达式的参数中使用。
使用方法:
以下是一个使用var
在lambda表达中推断参数类型的示例:
import java.util.List;import java.util.stream.Collectors;public class VarInLambda { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); List<Integer> nameLengths = names.stream() .map((var name) -> name.length()) .collect(Collectors.toList()); System.out.println(nameLengths); }}
注意事项:
- 使用
var
可以提高代码的简洁性,但请确保在适当的场景中使用它,以保持代码的可读性。
8. 运行单个Java源文件(J 330)
Java 11引入了JEP 330,允许开发者直接运行单个Java源文件,而无需先编译。这使得开发者可以更快速地测试和运行简单的Java程序。
使用方法:
要运单个Java源文件,只需在命令行中输入java HelloWorld.java
,其中HelloWorld.java
您要运行的Java源文件。
注意事项:
- 这个特性主要用于快速测试和运行简单的Java程序。对于复杂的项目,请继续使用构建工具(如Maven或Grad)进行编译和运行。
9. 依赖分析(JEP 335)
Java 11引入了JEP 335,它提供了一种新的工具,用于分析模块之间的依赖关系。这有助于开发者更好地理解和管理模块化Java应用程序的依赖关系。
使用方法:
要使用依赖分析工具,请在命令行中输入jdeps
,后跟您要分析的块或类文件的路径。例如:
jdeps -summary my-module.jar
注意事项:
-jdeps
工具可以帮助更好地理解和管理您的应用程序的依赖关系。在迁移到Java 11之前,您可以使用这个工具检查您的应用程序是否依赖于已移除模块。
Java 11是一个里程碑式的版本,它引入了一些显著的改进和变化,同时也修复了许多已知的Bug。以下是Java 11的修复Bug、移除项、废弃项和未解决问题,以及其他事项的详细描述:
10. 修复了的Bug
Java 11修复了大量已知的Bug,包括:
当Java 11发布时,Oracle发布了一个官方公告来描述Java 11修复了哪些Bug。下面是Java 11修复的一些主要Bug:
- Java虚拟机
Java虚拟机中最常见的Bug是安全漏洞。Java 11修复了JDK中多个严重的安全漏洞。此外,Java 11还修复了以下Bug:
- 在并发应用程序中可能出现的内存泄漏问题。
- JVM与特定CPU架构之间的兼容性问题。
- 解决了某些Windows操作系统下Java应用启动时间的性能问题。
- 解决了一些网络相关的问题,并针对性能进行了优化。
- 修正了在某些平台上可能导致Java虚拟机崩溃的Bug。
- 标准库
Java标准库中的Bug也得到了修复,包括:
- Java NIO和NIO2库中的一些Bug已被修复,包括零拷贝传输和文件I/O等操作的一些性能提升。
- 在Java集合库中,HashMap和ConcurrentHashMap的Bug已得到修复,这些Bug可能导致并发环境中的非预期行为。
- 在Java并发类库中,关于线程池的一些Bug已经得到了修复,包括线程池监控、自定义任务队列等问题。
- 组件和工具
Java 11还修复了许多与组件和工具相关的Bug,包括:
- 发生在JDK提供的诊断工具中的一些Bug已经修复,包括jcmd、jps、jstat等。
- JFR(Java Flight Recorder)的某些Bug已经得到了修复,这是一个新的性能分析工具,它可以直接内置到Java虚拟机中。
- 修正了JMX(Java Management Extensions)中的一些Bug,这是一个Java平台上实现管理和监测的框架。
11. 移除项
Java 11中移除了一些不再被支持的标志和API,包括:
- 移除了JDK的javafx模块,需要从OpenJFX中独立获取。
- 移除了JDK的Java EE和CORBA模块,这些模块现在已经是单独的规范项目。
- 移除了Pack200工具,建议使用Pack200实现的GZIP格式代替。
- 移除了不再使用的JavaFX Ant任务和Packager Tool。
12. 废弃项
Java 11中还废弃了一些API和功能,包括:
- 废弃了JDK的Java Applet技术,这意味着浏览器插件不再支持Java Applet。
- 废弃了Nashorn JavaScript引擎,在将来的版本中将会被移除。
- 废弃了JEP 320中引入的Pack200压缩算法的系统属性。
13. 已知问题
在Java 11中仍然存在一些已知的问题,包括:
- 在Linux分发版中,JavaFX WebView仍然无法正常工作。
- 在某些情况下,由于显式的引用类型和目标类型之间缺少转换,可能会出现编译错误。
- 在Windows上运行Java程序时,使用“-version”参数显示的版本信息可能与实际版本不匹配。
14. 其他事项
- Java 11是一个LTS(Long-Term Support)版本,也就是说,它将在未来几年内接收重要的安全修复和增强功能更新。
- Java 11是Java的一个重要里程碑,它预示着Oracle对Java发行周期的重新调整和对JDK模块化的重新定义。
总结
Java 11引入了许多新特性和功能,使得开发者可以更高效地编写、测试和运行Java用程序。在迁移到Java 11之前,请确保您了解这些新特性,并根据需要更新您的应用程序和依赖库。
如果您想更深入地了解Java 11的新特性和功能,可以查阅Oracle官方文档或其他相关的学习资源。同时,在实际开发中,建议先使用Java 11的新特性进行一些小规模的实验和测试,并逐步应用到实际项目中,以确保应用程序的正确性和稳定性。
来源地址:https://blog.csdn.net/sinat_26065899/article/details/130850320
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341