文章目录
写在前面
下载链接
- String
- lines()
- repeat(int)
- isBlank()
- strip()/stripLeading()/stripTrailing()
- CharSequence
- compare(CharSequence, CharSequence)
- Character
- toString(int)
- of(String, String...)
- Files
- writeString(Path, CharSequence)
- readString(Path)
- Reader
- nullReader()
- Writer
- nullWriter()
- InputStream
- nullInputStream()
- OutputStream
- nullOutputStream()
- Predicate
- not(Predicate)
- Collection
- toArray(IntFunction)
- Optional/OptionalInt/OptionalLong/OptionalDouble
- isEmpty()
isPresent() 方法此前已经存在, 现在我们使用 isEmpty() 方法.
- TimeUnit
- convert(Duration)
- Pattern
- asMatchPredicate()
- ListSelectionModel
- Thread
- destroy()/stop(Throwable)
- Policy
- ArrayIndexOutOfBoundsException
- IndexOutOfBoundsException
- System
- arraycopy
- setProperty(String, String)
- Base64
- Boolean
- parseBoolean
- TimSort
- Java Launcher
垃圾回收器
- String
- lines()
- isBlank()
- strip()/stripLeading()/stripTrailing()
- Character
- toString(int)
- Path
- of(String, String...)
- Files
- writeString(Path, CharSequence)
- readString(Path)
- Collection
- toArray(IntFunction)
- Thread
- destroy()/stop(Throwable)
写在前面
JDK 11 正式发布了哈, 网上摘录了一些 API 的修改.
一般都是 3 个版本为一个节点, jdk5/8 都是用的最普遍的, 而且官方也宣布 jdk11 将会是后面几年持续更新修复的版本.
一起来看看吧.
下载链接
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
垃圾回收器
- Low-Overhead Heap Profiling(低开销的 Heap Profiling)
- Transport Layer Security (TLS) 1.3(支持 TLS 1.3)
- 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 已进冻结期,
来源: https://blog.csdn.net/cmqwan/article/details/82927027