深度解析Java 9核心新特性


Java9 有哪些新特性?
Java 9在2017年发布时,确实带来了许多引人注目的新特性

平台模块系统(Jigsaw项目)
接口私有方法
Try-With Resources
匿名类
@SafeVarargs注释
集合工厂方法
Process API改进
新版本字符串方案
JShell:javashell(REPL)
控制面板
流API改进
针对Microsoft windows及更多应用程序的安装程序增强功能
Java平台模块系统(Jigsaw项目)
它是一种新的Java编程组件,可以用来收集Java代码(类和包)。这个项目的主要目标是轻松地将应用程序缩小到小型设备。在Java9中,JDK本身已经划分为一组模块,以使其更加轻量级。它还允许我们开发模块化应用程序。

接口私有方法
在Java9中,我们可以在接口中创建私有方法。接口允许我们声明有助于在非抽象方法之间共享公共代码的私有方法。

在Java9之前,在接口中创建私有方法会导致编译时错误。

Try-With Resources
Java在java7中引入了 try-with-resource 特性,该特性有助于在使用资源后自动关闭资源。

换句话说,我们可以说我们不需要显式地关闭资源(文件、连接、网络等),尝试使用 AutoClosable 接口自动关闭资源。

在Java7中,try with resources有一个限制,要求resource在区块中本地声明。

匿名类改进
Java9引入了一个新特性,允许我们将 diamond 运算符用于匿名类。Java7中不允许在匿名类中使用 diamond 。

在Java9中,只要推断的类型是可表示的,我们就可以在创建匿名内部类时使用菱形运算符。

Java@SafeVarargs注释
它是应用于接受 varargs 参数的方法或构造函数的注释。它用于确保方法不会对其 varargs参数执行不安全的操作。

它包含在Java7中,只能应用于

最终方法
静态方法
构造函数
Java集合工厂方法
工厂方法是一种特殊类型的静态方法,用于创建集合的不可修改实例。这意味着我们可以使用这些方法创建少量元素的列表、集合和映射。

它是 不可修改 的,因此添加新元素将引发 java.lang.UnsupportedOperationException 异常

Java Process API改进
Java改进了java9版本中的process api,有助于管理和控制操作系统进程。

在早期版本中,使用Java编程来管理和控制操作系统进程非常复杂。现在,添加了新的类和接口来执行此任务。

Java新版本字符串方案
Java版本字符串是包含特定于版本的信息的格式。此版本字符串由主要版本、次要版本、安全版本和修补程序更新版本组成。

在java9中,引入了一种新的字符串格式。

JShell:javashell(REPL)
它是一个交互式Javashell工具,它允许我们从Shell执行Java代码并立即显示输出。JShell是一个REPL(Read Evaluate Print Loop)工具,从命令行运行。如果我们想测试我们的业务逻辑并立即得到结果,这是有益的。

Java 9控制面板
Java控制面板用于控制嵌入在浏览器中的Java应用程序。此控制面板维护管理嵌入在浏览器中的Java应用程序的设置。

在Java9中,控制面板被重写为JavaFX应用程序,并且存储位置发生了变化。

Java9流API改进
在Java9中,流API得到了改进,并向流接口添加了新方法。 TakeWhile 、 dropWhile 和 ofNullable ,以及一个重载迭代方法来对流元素执行操作。

Microsoft windows安装程序增强
Java9包括 MicrosoftWindowsInstaller 的改进版本,并添加了以下特性。

这个安装程序允许我们启用和禁用web部署。我们可以通过选择Customsetup、install并单击安装程序的欢迎页面中的复选框来启用web部署。

macOS安装程序增强功能
Java9在macOS安装程序中包含以下特性。


添加更多诊断命令
Java9添加了一些新命令来改进诊断问题。这些诊断命令用于诊断热点和JDK。

java jcmd实用程序可用于向正在运行的Java虚拟机(JVM)发送诊断命令请求。

删除启动时JRE版本选择
Java9在启动时删除了JRE(Java运行时环境)版本选择。现在,现代应用程序拥有自己的活动安装程序,其中进一步包含管理JRE的方法。

删除JVM TI hprof代理
Java9已经从现有的JDK中删除了hprof。它不打算成为生产工具。一些性能更好的hprof代理已被取代,以获得更好的替代品。

拆下Jhat工具
Java在其新版本JDK9中删除了jhat工具。它是jdk6中添加的一个实验性的、不受支持的工具,现在已经过时了。

验证JVM命令行标志参数
Java验证所有数字JVM命令行标志的参数以避免失败。如果参数无效或超出范围,则会显示相应的错误消息。

已对需要数值的范围和可选项实施约束检查。

jlink:Java链接器
jlink是一种工具,可用于将一组模块组装到运行时映像中。它还允许我们将模块的依赖项组装到自定义运行时映像中。

链接时间是编译和运行时之间的一个阶段,jlink在那里将模块链接和组装到运行时映像。

数据报传输层安全(DTLS)
DTLS是一种用于在数据报上构建TLS的协议。JSSE(java secure socket extension)API支持DTLS协议以及1.0和1.2两个版本。

TLS协议需要TCP,因此不能用于保护不可靠的数据报流量。

TLS应用层协议协商扩展
此扩展允许TLS连接中的客户端和服务器协商应用程序协议。客户机-服务器相互通信并通知支持的应用程序协议。应用协议协商在TLS握手中完成。

用于TLS的OCSP装订
OCSP(联机证书状态协议)帮助TLS连接中的服务器检查吊销的X.509证书吊销。在TLS握手服务器期间,请与OCSP相应程序联系以获取证书。然后,服务器将吊销信息装订到客户端的证书上。

基于DRBG的安全随机实现
Java9包含了SecureRandom API中NIST SP800-90Ar1中指定的DRBG(确定性随机位生成器)机制的功能。

DRBG机制使用与SHA-512和AES-256一样强大的现代算法。这些机制中的每一个都可以配置不同的安全强度和特性,以满足用户需求。

禁用SHA-1证书
JDK的安全配置得到了改进。它提供了更灵活的机制来禁用具有基于SHA-1签名的X.509证书。

这个 jdk.certpath.disabledAlgorithms 安全属性通过几个新的约束得到了增强,这些约束允许对可以禁用的证书类型进行更大的控制。

默认情况下创建PKCS12密钥库
默认密钥库类型已从JKS修改为PKCS12。PKCS是一种可扩展的、标准的、广泛支持的用于存储加密密钥的格式。它通过存储私钥、可信公钥证书等提高了机密性。此功能还为与其他系统(如Mozilla、Microsoft的Internet Explorer和支持PKCS12的OpenSSL)的互操作性提供了机会。

SHA-3散列算法
新的Java版本支持SHA-3加密散列函数。

这个 java.security.message 摘要API支持各种算法,如:SHA3-224、SHA3-256、SHA3-384和SHA3-512。

以下提供程序支持SHA-3算法增强功能:

SUN提供程序:SHA3-224、SHA3-256、SHA3-384和SHA3-512
OracleUcrypto提供程序:solaris12.0支持的SHA-3摘要
弃用Java插件
Java插件和applet技术在jdk9中遭到了抨击。在未来的版本中,这些技术将被删除。

在web浏览器中运行applet和JavaFX应用程序需要Java插件。建议将应用程序重写为javaweb应用程序。

增强的Java控制面板
Java控制面板已经改进,信息更容易定位,搜索字段可用,不再使用模式对话框。请注意,一些选项的位置与以前版本的Java控制面板不同。

模块化Java应用程序打包
Java新版本将来自project jigsaw的特性集成到Java包中,包括模块感知和自定义运行时创建。

我们可以使用jlink工具来创建更小的包。

简化的Doclet API
旧的Doclet API被一个新的简化API所取代,该API利用了其他标准的、现有的API。在Java9中,标准的doclet被重写为使用新的DocletAPI。

编译器控件
现在,我们可以通过编译器指令选项来控制JVM编译。控制级别是运行时可管理的,并且是特定于方法的。编译器控件取代CompileCommand,并且向后兼容。

分段代码缓存
代码缓存被划分为不同的段。每一段都是一段经过编译的代码,可以提高性能并实现可扩展性。

统一JVM日志记录
Java新版本为JVM的所有组件引入了一个通用的日志系统。

删除jdk8中不推荐的GC组合
不推荐使用的垃圾收集器组合已从JDK 9中删除。以下是新版本中不支持的垃圾收集器组合。

DefNew + CMS
ParNew + SerialOld
Incremental CMS
统一GC日志记录
通过使用统一的JVM日志框架重新实现垃圾收集日志记录。

弃用并发标记扫描(CMS)垃圾收集器
不推荐使用并发标记扫描(CMS)垃圾收集器。当命令行请求时,它会发出警告消息。垃圾优先(garbagefirst,G1)垃圾收集器旨在替代CMS的大多数用途。

Process API更新
ProcessAPI通过方法和接口得到了改进。这个API处理操作系统进程。

ProcessHandle 类用于获取进程的本机进程ID、参数、命令、开始时间、累计CPU时间、用户、父进程和子进程。

压缩字符串
在新版本中,Java对字符串使用了更节省空间的内部表示。在以前的版本中,字符串存储在char数组中,每个字符占用两个字节。现在,字符串的新内部表示形式是byte类。

平台日志API和服务
这个 java.util.logging 文件API有助于记录消息,并为消费者提供服务接口。应用程序或库可以提供此服务的实现,以将消息记录到日志框架。如果没有提供实现,则使用默认实现。

更多并发更新
jdk9中添加了更多的并发更新。这些更新是经过改进的可完成的未来API和可互操作的发布-订阅框架。

XML目录
添加了标准XML目录API,它支持组织推进OASIS(结构化信息标准)XML目录1.1版。这个API由目录解析器组成,它可以作为JAXP处理器的一个内在函数。

方便工厂集合方法
此功能使创建包含少量元素的集合和映射的实例变得更容易。在 List 、 Set 和 Map 中添加了一些新的方法来创建不可变的实例。例如:

Set<String> alphabet = Set.of(1, 2, 3);
增强型Deprecation
对 @Deprecated 注释进行了改进,以提供有关API的状态和预期处置得更好信息。添加了以下新元素。

@Deprecated(forremovation=true)
@Deprecated(since=“version”)
旋转等待提示
它使Java代码能够通知正在执行自旋循环。自旋循环反复检查某个条件是否为真,例如何时可以获取锁,之后可以安全地执行一些计算,然后释放锁。这个API纯粹是一个提示,没有语义行为需求。

筛选传入序列化数据
它有助于过滤对象序列化数据流的传入日期,以提高健壮性和安全性。对象序列化客户端可以更容易地验证其输入,而导出的远程方法调用(RMI)对象也可以更容易地验证调用参数。

序列化客户端实现在 ObjectInputStream 上设置的筛选器接口。对于RMI,对象通过 RemoteServerRef 导出, RemoteServerRef 在 marshallinputstream 上设置过滤器,以便在调用参数解组时验证它们。

堆栈遍历API
Java包含了一个堆栈遍历API,允许对堆栈中的信息进行延迟访问。它还可以方便地过滤信息。

如果配置了 stack walker ,那么这个stack walking API允许访问类对象。

Nashorn的解析器API
Java添加了解析器API,允许在服务器端框架中启用应用程序,特别是IDE等。。

它可以用来用 Parser 类的方法从字符串、URL或文件解析ECMAScript代码。此类的方法返回 CompilationUnitTree 类的对象,该类将 ECMAScript 代码表示为抽象语法树。

Nashorn解析器API位于 jdk.nashorn.api.tree 包。

在Nashorn中实现选定的ECMAScript 6特性
Java在ECMA-62的第6版中为Nashorn添加了一些新特性。以下是实现的特性。

模板字符串
let、const和block范围
循环的迭代器和for
映射、集、WeakMap和WeakSet
符号
二进制和八进制文字
为模块化准备javafxui控件和cssapi
Java包括用于CSS功能和JavaFXUI控件的公共API。这些功能以前只能通过内部软件包提供,但由于采用模块化方法,现在可以访问。

一个新的包裹 javafx.scene.control.skin 由一组类组成,以提供每个UI(用户界面)控件的默认实现。

BeanInfo注释
@beaninfo Javadoc标记将替换为注释类型JavaBean、BeanProperty和SwingContainer。

我们可以在Bean类中直接使用这些属性。它还允许自动删除自动创建的类,并在运行时生成BeanInfo期间设置相应的特性属性。

TIFF图像I/O
TIFF(标签图像文件格式)是为读写而添加的标准格式。它位于包装内 javax.imageio . 新包 javax.imageio.plugins.tiff 是为了提供简化tiff元数据可选操作的类而添加的。

Windows和Linux下的HiDPI图形
在Windows和Linux上自动缩放AWT和Swing组件的每英寸高点(HiDPI)显示。

JDK已经在osx上支持HiDPI“retina displays”。

在此版本之前,在Windows和Linux上,Java应用程序的大小和渲染都是基于像素的,甚至在HiDPI显示器上,其像素密度可能是传统显示器的2到3倍。这导致GUI组件和窗口太小,无法读取或使用。

特定于平台的桌面功能
一些新方法被添加到 java.awt.Desktop 类。这些方法提供以下特性。

显示自定义的“关于”和“首选项”窗口。
处理打开或打印文件列表的请求。
处理打开URL的请求。
打开本机帮助查看器应用程序。
设置默认菜单栏。
启用或禁用突然终止的应用程序。
在Linux上启用GTK 3
Java新版本允许Java图形应用程序(JavaFX、Swing或抽象窗口工具包)在Linux上使用GTK版本。

JDK默认使用GTK+2,如果不可用,则使用GTK+3。

我们可以通过设置jdk.gtk.版本.

Unicode 8.0标准
Java在其新的Java9版本中支持Unicode 8.0,以前使用的是Unicode 6.2。

Java9支持Unicode 6.3、7.0和8.0标准,这些标准结合了10555个字符、29个脚本和42个块。

默认情况下启用CLDR区域设置数据
CLDR(公共区域设置数据存储库)表示Unicode CLDR项目提供的区域设置数据。它最初是在jdk8中添加的,现在是jdk9中的默认值。

我们可以通过设置属性来启用与Java8兼容的行为 java.locale.providers 提供程序一个值,COMPAT在CLDR之前。

UTF-8属性文件
UTF-8是表示非拉丁字符的一种方便方法。新版本的java加载UTF-8编码的属性文件。在早期版本中,加载属性资源包时使用ISO-8859-1编码。

Java删除了认可的标准覆盖机制和扩展机制。
这个rt.jar以及tools.jar两者都已从JRE中删除。
默认情况下,JDK的内部api是不可访问的

01. Java 9 新特性 – 介绍
Java 9最大的亮点莫过于引入了模块化系统(Project Jigsaw)。这个系统彻底改变了Java的结构,让大型项目更加易于管理和维护。除此之外,它还引入了更多的API改进和新工具,为Java程序员提供了更多的武器。

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。

这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

02. 特性简介
这里只列举几个关键特性:

模块化系统(Jigsaw项目):这是Java 9最核心的改变。
REPL (JShell):交互式编程环境,提高学习和测试效率。
集合工厂方法:简化不可变集合的创建。
接口中的私有方法:进一步增强了接口的功能。
03. 环境配置
使用Java 9之前,需要确保你的开发环境已经安装了Java 9。你可以从Oracle的官方网站下载,并遵循相应的安装指南来配置。

04. 模块化
模块化系统是Java 9的大杀器。在此之前,Java的类和包组织一直比较松散。通过模块化,Java 9允许开发者将应用程序划分为多个模块,每个模块有自己明确的依赖关系。

module com.myapp {
    requires java.sql;
    exports com.myapp.api;
}
这段代码定义了一个名为com.myapp的模块,它依赖于java.sql模块,并导出com.myapp.api包。

05. REPL (JShell)
JShell是Java 9引入的一个交互式编程环境。它允许你快速运行Java代码片段,非常适合学习和实验。

jshell> int a = 10
a ==> 10

jshell> System.out.println(a)
10
06. 改进JavaDocs
Java 9对JavaDocs做了一些改进,比如增加了搜索功能,使得查找API文档更加方便。

07. 多版本共存JAR
这允许同一个JAR文件包含多个Java平台版本的类文件,有助于库的作者更好地支持不同版本的Java。

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。

这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

08. 集合不可变实例工厂方法
Java 9提供了一种更简洁的方法来创建不可变集合。

List<String> list = List.of("apple", "banana", "orange");
09. 接口中的私有方法
在Java 9之前,接口只能有公共抽象方法和公共静态方法。现在,它们还可以有私有方法和私有静态方法。

public interface MyInterface {
    private static String getDefaultGreeting() {
        return "Hello, World!";
    }

    default void greet() {
        String greeting = getDefaultGreeting();
        System.out.println(greeting);
    }
}
10. 改进进程管理API
Java 9增强了对操作系统进程的管理,使得Java程序可以更好地控制和管理操作系统进程。

ProcessHandle currentProcess = ProcessHandle.current();
System.out.println("当前进程的ID是: " + currentProcess.pid());
11. 增强流(Stream)API
Java 9对Stream API做了进一步的增强,例如增加了takeWhile、dropWhile等方法。

Stream.of(1, 2, 3, 2, 1)
      .takeWhile(n -> n < 3)
      .forEach(System.out::println); // 输出 1, 2
12. try-with-resources语句
Java 9简化了try-with-resources语句,使得可以更方便地管理资源。

// Java 9之前
try (Resource res = new Resource()) {
    // 使用res
}

// Java 9
Resource res = new Resource();
try (res) {
    // 使用res
}
13. 增强@Deprecated注解
Java 9对@Deprecated注解进行了增强,可以提供更多信息,例如表明何时被弃用,是否计划在未来移除等。

@Deprecated(since="9", forRemoval=true)
public void oldMethod() {
    // ...
}
14. 内部类的方块操作符
Java 9允许在内部类的构造器中使用尖括号操作符,简化了内部类的使用。

Map<String, List<String>> myMap = new HashMap<>() {
    // ...
};
15. Optional类
Java 9对Optional类进行了增强,比如增加了ifPresentOrElse方法。

Optional<String> optional = Optional.of("Hello");

optional.ifPresentOrElse(
    System.out::println,
    () -> System.out.println("Value is absent")
);
16. 多分辨率图像API
这个API允许单个图像实例可以管理不同分辨率的图像版本,对于高分辨率显示器的支持非常有用。

17. CompletableFuture API
Java 9对CompletableFuture API做了进一步的增强,例如增加了delayedExecutor方法,允许延迟执行。

CompletableFuture<String> future = CompletableFuture
    .supplyAsync(() -> "Hello")
    .thenApplyAsync(name -> name + " World", CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS));
18. 其他特性
Java 9还包括很多其他小的改进和优化,比如HTTP 2客户端(实验性的),改进的Logger API等。

总结
Java 9带来的这些新特性无疑为Java生态注入了新的活力。从模块化系统到各种API的增强,Java 9的每一个改进都在努力使Java成为一个更强大、更灵活、更现代的编程语言。
Java 9 引入了一些新的核心特性,包括模块系统、接口的私有方法、try-with-resources 的改进、改进的Javadoc、多版本化JAR、和更多。以下是一些关键特性的简要描述和示例代码:

模块系统 (Project Jigsaw):

模块系统允许开发者将JAR文件划分为多个模块,并控制哪些模块可以访问其他模块的内部API。

// 在module-info.java中定义模块依赖
module com.example.app {
    requires java.base;
    requires com.example.util;
}

```python
class BertPooler(nn.Module):
    def __init__(self, config):
        super().__init__()
        self.dense = nn.Linear(config.hidden_size, config.hidden_size)
        self.activation = nn.Tanh()

    def forward(self, hidden_states):
        # We "pool" the model by simply taking the hidden state corresponding
        # to the first token.
        first_token_tensor = hidden_states[:, 0]
        pooled_output = self.dense(first_token_tensor)
        pooled_output = self.activation(pooled_output)
        return pooled_output
from transformers.models.bert.configuration_bert import *
import torch
config = BertConfig.from_pretrained("bert-base-uncased")
bert_pooler = BertPooler(config=config)
print("input to bert pooler size: {}".format(config.hidden_size))
batch_size = 1
seq_len = 2
hidden_size = 768
x = torch.rand(batch_size, seq_len, hidden_size)
y = bert_pooler(x)
print(y.size())
```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值