从JDK8到JDK11,带来了哪些新特性新变化

文章目录

写在前面

JDK 11 正式发布了哈,网上摘录了一些api的修改。
一般都是3个版本为一个节点,jdk5/8都是用的最普遍的,而且官方也宣布jdk11将会是后面几年持续更新修复的版本。
一起来看看吧。

下载链接

https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html
或者
https://download.csdn.net/download/cmqwan/10699883

String

lines()

字符串实例方法,使用专门的 Spliterator 来懒惰地提供源字符串中的行。

repeat(int)

按照参数 int 提供的次数来重复字符串的运行次数。

isBlank()

验证当前字符串是否为空,或者是否只包括空白字符(空白字符由 Character.isWhiteSpace(int) 验证)。

strip()/stripLeading()/stripTrailing()

这三个方法的作用分别是去掉字符串头和尾的空白符、字符串头的空白符、字符串尾的空白符,基本与 trim()/trimLeft()/trimRight() 方法相同,不过它们的空白字符由 Character.isWhiteSpace(int) 验证。

CharSequence

compare(CharSequence, CharSequence)

按字典顺序进行排序。
它被 CharSequence/StringBuffer/StringBuilder 中的 compareTo() 使用。因此,这三个类都实现了 Comparable。

Character

toString(int)

of(String, String…)

此前我们需要使用 Paths.get()。现在,我们像其他类一样使用 of()。

Files

writeString(Path, CharSequence)

我们可以使用该方法来保存一个 String 字符串。

readString(Path)

我们可以使用该方法来读取一个 String 字符串。

Reader

nullReader()

使用该方法,我们可以得到一个不执行任何操作的 Reader。

Writer

nullWriter()

使用该方法,我们可以得到一个不执行任何操作的 Writer。

InputStream

nullInputStream()

使用该方法,我们可以得到一个不执行任何操作的 InputStream。

OutputStream

nullOutputStream()

使用该方法,我们可以得到一个不执行任何操作的 OutputStream。

Predicate

not(Predicate)

此前在需要反转条件的地方,我们选择不使用方法引用。现在相反,我们可以使用方法引用。

Collection

toArray(IntFunction)

此前,我们需要使用像 list.toArray(new String[list.size())]) 这样的无风格标记(non-stylish notation)来从一个集合创建一个类型化数组。现在,我们可以以风格标记(stylish notation)的方式进行编写。

Optional/OptionalInt/OptionalLong/OptionalDouble

isEmpty()

isPresent() 方法此前已经存在,现在我们使用 isEmpty() 方法。

TimeUnit

convert(Duration)

该方法已经添加到 java.util.concurrent.TimeUnit 中。

Pattern

asMatchPredicate()

到目前为止,只有 asPredicate() 方法,但现在我们还拥有 asMatchPredicate() 方法。

更多其他特性

ListSelectionModel

已添加 getSelectedIndices() / getSelectedCount() 方法

Thread

destroy()/stop(Throwable)

移除 destroy() 方法,保留 stop() 方法。

Policy

已移除 javax.security.auth.Policy。

ArrayIndexOutOfBoundsException

抛出的异常信息已修改:

IndexOutOfBoundsException

在本次变更中,已在异常信息中移除 hyphens。

System

arraycopy

setProperty(String, String)

之前改变 java.home 会导致一些问题,现在问题已得到解决。
支持 Japanese New Era
Japanese Imperial Era 计划于 2019.5.1 改用新的规则。本次变更是作为 NewEra 占位符引入的。
在日本政府宣布之后,它将在 JDK 12.0.1 中进行更新。
JDK10.0.1
JDK11 ea18
目前我们还未能将 May 1st Heisei 31 作为我们的 JapaneseDate。

Base64

从 ea20 起,使用 AVX512 进行编码会变得更快,但在 Windows 上无法确定。

Boolean

parseBoolean

官方表示,在删除冗余的空检查后,它的速度变得更快。

TimSort

TimSort 是用于 Array.sort() 和 Collection.sort() 的主要算法。
但它有一个错误,主要发生在为某些序列抛出一个 ArrayIndexOutOfBoundsException 异常,不过似乎已修复,尚未确定。

jdk10中带来了var隐式变量声明,如:

var x = new Foo();
for (var x : xs) { ... }
try (var x = ...) { ... } catch ...

jdk11中将允许在声明隐式类型的 lambda 表达式的形式参数时使用 var,如:

(var x, var y) -> x.process(y)
  或者干脆省略掉var符号

(x, y) -> x.process(y)

324: Key Agreement with Curve25519 and Curve448(Curve25519 和 Curve448 算法的密钥协议)
327: Unicode 10
328: Flight Recorder(飞行记录器)

"飞行记录器"旨在“提供一个低开销的数据收集框架,用于对Java应用程序和HotSpot JVM进行故障诊断”。

Java Launcher

329: ChaCha20 and Poly1305
Cryptographic Algorithms(ChaCha20 和 Poly1305 加密算法)
330: Launch Single-File Source-Code Programs(启动单一文件的源代码程序)

主要是改进 Java Launcher 以支持一个命令执行单个 Java 源代码文件。换句话说,在条件满足的情况下,可以简单地直接编译并运行单文件程序,而不再需要调用 javac ,也不需要打包 jar 文件。

比如说,可直接运行:

java HelloWorld.java
而不再需要:

javac -d <memory> HelloWorld.java
java -cp <memory> hello.World

垃圾回收器

331: Low-Overhead Heap Profiling(低开销的 Heap Profiling)
332: Transport Layer Security (TLS) 1.3(支持 TLS 1.3)
333: ZGC: A Scalable Low-Latency Garbage Collector(可伸缩低延迟垃圾收集器)

上一代的垃圾回收器G1已经足够强大,但是,ZGC可能会更加惊艳,ZGC的一个目标是将垃圾回收的暂停时间压缩到10ms之内,这意味着Java可以成为应用到更广泛的领域。官方文档提供了ZGC与G1的benchmarks测试对比,我们看到对比G1的156.806ms平均时间,ZGC的垃圾收集时间低至1.091ms

ZGC
avg: 1.091ms (+/-0.215ms)
95th percentile: 1.380ms
99th percentile: 1.512ms
99.9th percentile: 1.663ms
99.99th percentile: 1.681ms
max: 1.681ms

G1
avg: 156.806ms (+/-71.126ms)
95th percentile: 316.672ms
99th percentile: 428.095ms
99.9th percentile: 543.846ms
99.99th percentile: 543.846ms
max: 543.846ms

320: Remove the Java EE and CORBA Modules(删除 Java EE 和 CORBA 模块)
335: Deprecate the Nashorn JavaScript Engine(弃用 Nashorn JavaScript 引擎)
336: Deprecate the Pack200 Tools and API(弃用 Pack200 工具和 API)

此外,还有一些除 JEP 之外的API变化,比较实用的有以下几个:

String

lines()

字符串实例方法,使用专门的 Spliterator 来懒惰地提供源字符串中的行

jshell> “test\nhoge\n”.lines().map(String::toUpperCase).toArray()
$11 ==> Object[2] { “TEST”, “HOGE” }
repeat(int)
  按照参数 int 提供的次数来重复字符串的运行次数

jshell> "test".repeat(3) $7 ==> "testtesttest"

isBlank()

验证当前字符串是否为空,或者是否只包括空白字符(空白字符由 Character.isWhiteSpace(int) 验证)

jshell> var halfSpace = "\u0020"
halfSpace ==> " "

jshell> halfSpace.isBlank()
$11 ==> true

jshell> var fullSpace = "\u3000"
fullSpace ==> " "

jshell> fullSpace.isBlank()
$13 ==> true

strip()/stripLeading()/stripTrailing()

这三个方法的作用分别是去掉字符串头和尾的空白符、字符串头的空白符、字符串尾的空白符,基本与 trim()/trimLeft()/trimRight() 方法相同,不过它们的空白字符由 Character.isWhiteSpace(int) 验证

jshell> var aaa = fullSpace + "aaa" + fullSpace
aaa ==> " aaa "

jshell> aaa.strip()
$14 ==> "aaa"

jshell> aaa.trim()
$15 ==> " aaa "

Character

toString(int)

JDK 11 使这个过程变得更加方便

jdk10:

jshell> Character.toString(65)
|  Error:
|  incompatible types: possible lossy conversion from int to char
|  Character.toString(65)
|

jdk11:

jshell> Character.toString(65)
$9 ==> "A"

Path

of(String, String…)

此前我们需要使用 Paths.get()。现在,我们像其他类一样使用 of()。

Files

writeString(Path, CharSequence)

我们可以使用该方法来保存一个 String 字符串。

shell> Files.writeString(Path.of("test.txt"), "Hello!!!")
$3 ==> test.txt

readString(Path)

我们可以使用该方法来读取一个 String 字符串。

jshell> Files.readString(Path.of("test.txt"))
$4 ==> "Hello!!!"

Collection

toArray(IntFunction)

此前,我们需要使用像 list.toArray(new String[list.size())]) 这样的无风格标记(non-stylish notation)来从一个集合创建一个类型化数组。现在,我们可以以风格标记(stylish notation)的方式进行编写。

在这里插入代码片shell> List.of(“aa”,“bb”).toArray(String[]::new) $1 ==> String[2] { “aa”, “bb” }

Thread

destroy()/stop(Throwable)

移除 destroy() 方法,保留 stop() 方法。

Java 9以来,oracle实行了半年一次版本的新计划,很多同学说 9未掌握10刚了解11已进冻结期,

10-11 04:25