Skip to content

Commit e8faa4b

Browse files
committed
[docs update] java 新特性部分内容完善
1 parent 8718372 commit e8faa4b

File tree

8 files changed

+1039
-951
lines changed

8 files changed

+1039
-951
lines changed

docs/.vuepress/config.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ module.exports = config({
7878
editLinks: true, docsDir: 'docs', seo: true,
7979
nav: [
8080
{ text: "Java面试指南", icon: "java", link: "/home", },
81-
{ text: "Java面试指北", icon: "recommend", link: "https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7"},
82-
{ text: "官方知识星球", icon: "recommend", link: "https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc"},
81+
{ text: "Java面试指北", icon: "recommend", link: "https://www.yuque.com/docs/share/f37fc804-bfe6-4b0d-b373-9c462188fec7" },
82+
{ text: "官方知识星球", icon: "recommend", link: "https://www.yuque.com/docs/share/8a30ffb5-83f3-40f9-baf9-38de68b906dc" },
8383
{
8484
text: "开发工具", icon: "Tools", link: "/tools/",
8585
items: [
@@ -206,7 +206,7 @@ module.exports = config({
206206
},
207207
{
208208
title: "新特性", prefix: "new-features/",
209-
children: ["java8-common-new-features", "java8-tutorial-translate", "java新特性总结"],
209+
children: ["java8-common-new-features", "java8-tutorial-translate", "java9", "java10", "java11", "java12-13", "java14-15"],
210210
},
211211
{
212212
title: "小技巧", prefix: "tips/",

docs/java/new-features/java10.md

+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
---
2+
title: Java 10 新特性概览
3+
category: Java
4+
tag:
5+
- Java新特性
6+
---
7+
8+
**Java 10** 发布于 2018 年 3 月 20 日,最知名的特性应该是 `var` 关键字(局部变量类型推断)的引入了,其他还有垃圾收集器改善、GC 改进、性能提升、线程管控等一批新特性。
9+
10+
**概览(精选了一部分)**
11+
12+
- [JEP 286:局部变量类型推断](https://openjdk.java.net/jeps/286)
13+
- [JEP 304:垃圾回收器接口](https://openjdk.java.net/jeps/304)
14+
- [JEP 307:G1 并行 Full GC](https://openjdk.java.net/jeps/307)
15+
- [JEP 310:应用程序类数据共享(扩展 CDS 功能)](https://openjdk.java.net/jeps/310)
16+
- [JEP 317:实验性的基于 Java 的 JIT 编译器](https://openjdk.java.net/jeps/317)
17+
18+
## 局部变量类型推断(var)
19+
20+
由于太多 Java 开发者希望 Java 中引入局部变量推断,于是 Java 10 的时候它来了,也算是众望所归了!
21+
22+
Java 10 提供了 `var` 关键字声明局部变量。
23+
24+
```java
25+
var id = 0;
26+
var codefx = new URL("https://mp.weixin.qq.com/");
27+
var list = new ArrayList<>();
28+
var list = List.of(1, 2, 3);
29+
var map = new HashMap<String, String>();
30+
var p = Paths.of("src/test/java/Java9FeaturesTest.java");
31+
var numbers = List.of("a", "b", "c");
32+
for (var n : list)
33+
System.out.print(n+ " ");
34+
```
35+
36+
var 关键字只能用于带有构造器的局部变量和 for 循环中。
37+
38+
```java
39+
var count=null; //❌编译不通过,不能声明为 null
40+
var r = () -> Math.random();//❌编译不通过,不能声明为 Lambda表达式
41+
var array = {1,2,3};//❌编译不通过,不能声明数组
42+
```
43+
44+
var 并不会改变 Java 是一门静态类型语言的事实,编译器负责推断出类型。
45+
46+
另外,Scala 和 Kotlin 中已经有了 `val` 关键字 ( `final var` 组合关键字)。
47+
48+
相关阅读:[《Java 10 新特性之局部变量类型推断》](https://zhuanlan.zhihu.com/p/34911982)
49+
50+
## 垃圾回收器接口
51+
52+
在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。 Java 10 通过引入一套纯净的垃圾收集器接口来将不同垃圾收集器的源代码分隔开。
53+
54+
## G1 并行 Full GC
55+
56+
从 Java9 开始 G1 就了默认的垃圾回收器,G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java9 的 G1 的 FullGC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收期在无法回收内存的时候触发 Full GC。
57+
58+
为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 FullGC 改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。
59+
60+
## 集合增强
61+
62+
`List``Set``Map` 提供了静态方法`copyOf()`返回入参集合的一个不可变拷贝。
63+
64+
```java
65+
static <E> List<E> copyOf(Collection<? extends E> coll) {
66+
return ImmutableCollections.listCopy(coll);
67+
}
68+
```
69+
70+
使用 `copyOf()` 创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 `java.lang.UnsupportedOperationException` 异常。 IDEA 也会有相应的提示。
71+
72+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/java-guide-blog/image-20210816154125579.png)
73+
74+
并且,`java.util.stream.Collectors` 中新增了静态方法,用于将流中的元素收集为不可变的集合。
75+
76+
```java
77+
var list = new ArrayList<>();
78+
list.stream().collect(Collectors.toUnmodifiableList());
79+
list.stream().collect(Collectors.toUnmodifiableSet());
80+
```
81+
82+
## Optional 增强
83+
84+
`Optional` 新增了`orElseThrow()`方法来在没有值时抛出指定的异常。
85+
86+
```java
87+
Optional.ofNullable(cache.getIfPresent(key))
88+
.orElseThrow(() -> new PrestoException(NOT_FOUND, "Missing entry found for key: " + key));
89+
```
90+
91+
## 应用程序类数据共享(扩展 CDS 功能)
92+
93+
在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing,简称 CDS),允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。CDS 在当时还是 Oracle JDK 的商业特性。
94+
95+
Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS 为 (Application Class-Data Sharing,AppCDS) 支持,大大加大了 CDS 的适用范围。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。
96+
97+
## 实验性的基于 Java 的 JIT 编译器
98+
99+
Graal 是一个基于 Java 语言编写的 JIT 编译器,是 JDK 9 中引入的实验性 Ahead-of-Time (AOT) 编译器的基础。
100+
101+
Oracle 的 HotSpot VM 便附带两个用 C++ 实现的 JIT compiler:C1 及 C2。在Java 10 (Linux/x64, macOS/x64) 中,默认情况下HotSpot 仍使用C2,但通过向java 命令添加 `-XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler` 参数便可将 C2 替换成 Graal。
102+
103+
相关阅读:[深入浅出 Java 10 的实验性 JIT 编译器 Graal - 郑雨迪](https://www.infoq.cn/article/java-10-jit-compiler-graal)
104+
105+
## 其他
106+
107+
- **线程-局部管控**:Java 10 中线程管控引入 JVM 安全点的概念,将允许在不运行全局 JVM 安全点的情况下实现线程回调,由线程本身或者 JVM 线程来执行,同时保持线程处于阻塞状态,这种方式使得停止单个线程变成可能,而不是只能启用或停止所有线程
108+
- **备用存储装置上的堆分配**:Java 10 中将使得 JVM 能够使用适用于不同类型的存储机制的堆,在可选内存设备上进行堆内存分配
109+
- ......
110+
111+
## 参考
112+
113+
- Java 10 Features and Enhancements : https://howtodoinjava.com/java10/java10-features/
114+
115+
- Guide to Java10 : <https://www.baeldung.com/java-10-overview>
116+
117+
- 4 Class Data Sharing : https://docs.oracle.com/javase/10/vm/class-data-sharing.htm#JSJVM-GUID-7EAA3411-8CF0-4D19-BD05-DF5E1780AA91
118+
119+

docs/java/new-features/java11.md

+127
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
---
2+
title: Java 11 新特性概览
3+
category: Java
4+
tag:
5+
- Java新特性
6+
---
7+
8+
**Java 11** 于 2018 年 9 月 25 日正式发布,这是很重要的一个版本!Java 11 和 2017 年 9 月份发布的 Java 9 以及 2018 年 3 月份发布的 Java 10 相比,其最大的区别就是:在长期支持(Long-Term-Support)方面,**Oracle 表示会对 Java 11 提供大力支持,这一支持将会持续至 2026 年 9 月。这是据 Java 8 以后支持的首个长期版本。**
9+
10+
![](https://img-blog.csdnimg.cn/20210603202746605.png)
11+
12+
**概览(精选了一部分)**
13+
14+
- [JEP 321:HTTP Client 标准化](https://openjdk.java.net/jeps/321)
15+
- [JEP 333:ZGC(可伸缩低延迟垃圾收集器)](https://openjdk.java.net/jeps/333)
16+
- [JEP 323:Lambda 参数的局部变量语法](https://openjdk.java.net/jeps/323)
17+
- [JEP 330:启动单文件源代码程序](https://openjdk.java.net/jeps/330)
18+
19+
## HTTP Client 标准化
20+
21+
Java 11 对 Java 9 中引入并在 Java 10 中进行了更新的 Http Client API 进行了标准化,在前两个版本中进行孵化的同时,Http Client 几乎被完全重写,并且现在完全支持异步非阻塞。
22+
23+
并且,Java 11 中,Http Client 的包名由 `jdk.incubator.http` 改为`java.net.http`,该 API 通过 `CompleteableFuture` 提供非阻塞请求和响应语义。使用起来也很简单,如下:
24+
25+
```java
26+
var request = HttpRequest.newBuilder()
27+
.uri(URI.create("https://javastack.cn"))
28+
.GET()
29+
.build();
30+
var client = HttpClient.newHttpClient();
31+
32+
// 同步
33+
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
34+
System.out.println(response.body());
35+
36+
// 异步
37+
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
38+
.thenApply(HttpResponse::body)
39+
.thenAccept(System.out::println);
40+
```
41+
42+
## String 增强
43+
44+
Java 11 增加了一系列的字符串处理方法:
45+
46+
```java
47+
//判断字符串是否为空
48+
" ".isBlank();//true
49+
//去除字符串首尾空格
50+
" Java ".strip();// "Java"
51+
//去除字符串首部空格
52+
" Java ".stripLeading(); // "Java "
53+
//去除字符串尾部空格
54+
" Java ".stripTrailing(); // " Java"
55+
//重复字符串多少次
56+
"Java".repeat(3); // "JavaJavaJava"
57+
//返回由行终止符分隔的字符串集合。
58+
"A\nB\nC".lines().count(); // 3
59+
"A\nB\nC".lines().collect(Collectors.toList());
60+
```
61+
62+
## Optional 增强
63+
64+
新增了`empty()`方法来判断指定的 `Optional` 对象是否为空。
65+
66+
```java
67+
var op = Optional.empty();
68+
System.out.println(op.isEmpty());//判断指定的 Optional 对象是否为空
69+
```
70+
71+
## ZGC(可伸缩低延迟垃圾收集器)
72+
73+
**ZGC 即 Z Garbage Collector**,是一个可伸缩的、低延迟的垃圾收集器。
74+
75+
ZGC 主要为了满足如下目标进行设计:
76+
77+
- GC 停顿时间不超过 10ms
78+
- 即能处理几百 MB 的小堆,也能处理几个 TB 的大堆
79+
- 应用吞吐能力不会下降超过 15%(与 G1 回收算法相比)
80+
- 方便在此基础上引入新的 GC 特性和利用 colored 针以及 Load barriers 优化奠定基础
81+
- 当前只支持 Linux/x64 位平台
82+
83+
ZGC 目前 **处在实验阶段**,只支持 Linux/x64 平台。
84+
85+
与 CMS 中的 ParNew 和 G1 类似,ZGC 也采用标记-复制算法,不过 ZGC 对该算法做了重大改进。
86+
87+
在 ZGC 中出现 Stop The World 的情况会更少!
88+
89+
详情可以看 : [《新一代垃圾回收器 ZGC 的探索与实践》](https://tech.meituan.com/2020/08/06/new-zgc-practice-in-meituan.html)
90+
91+
## Lambda 参数的局部变量语法
92+
93+
从 Java 10 开始,便引入了局部变量类型推断这一关键特性。类型推断允许使用关键字 var 作为局部变量的类型而不是实际类型,编译器根据分配给变量的值推断出类型。
94+
95+
Java 10 中对 var 关键字存在几个限制
96+
97+
- 只能用于局部变量上
98+
- 声明时必须初始化
99+
- 不能用作方法参数
100+
- 不能在 Lambda 表达式中使用
101+
102+
Java11 开始允许开发者在 Lambda 表达式中使用 var 进行参数声明。
103+
104+
```java
105+
// 下面两者是等价的
106+
Consumer<String> consumer = (var i) -> System.out.println(i);
107+
Consumer<String> consumer = (String i) -> System.out.println(i);
108+
```
109+
110+
## 启动单文件源代码程序
111+
112+
这意味着我们可以运行单一文件的 Java 源代码。此功能允许使用 Java 解释器直接执行 Java 源代码。源代码在内存中编译,然后由解释器执行,不需要在磁盘上生成 `.class` 文件了。唯一的约束在于所有相关的类必须定义在同一个 Java 文件中。
113+
114+
对于 Java 初学者并希望尝试简单程序的人特别有用,并且能和 jshell 一起使用。一定能程度上增强了使用 Java 来写脚本程序的能力。
115+
116+
## 其他
117+
118+
- **新的垃圾回收器 Epsilon** :一个完全消极的 GC 实现,分配有限的内存资源,最大限度的降低内存占用和内存吞吐延迟时间
119+
- **低开销的 Heap Profiling** :Java 11 中提供一种低开销的 Java 堆分配采样方法,能够得到堆分配的 Java 对象信息,并且能够通过 JVMTI 访问堆信息
120+
- **TLS1.3 协议** :Java 11 中包含了传输层安全性(TLS)1.3 规范(RFC 8446)的实现,替换了之前版本中包含的 TLS,包括 TLS 1.2,同时还改进了其他 TLS 功能,例如 OCSP 装订扩展(RFC 6066,RFC 6961),以及会话散列和扩展主密钥扩展(RFC 7627),在安全性和性能方面也做了很多提升
121+
- **飞行记录器(Java Flight Recorder)** :飞行记录器之前是商业版 JDK 的一项分析工具,但在 Java 11 中,其代码被包含到公开代码库中,这样所有人都能使用该功能了。
122+
- ......
123+
124+
## 参考
125+
126+
- JDK 11 Release Notes:https://www.oracle.com/java/technologies/javase/11-relnote-issues.html
127+
- Java 11 – Features and Comparison: <https://www.geeksforgeeks.org/java-11-features-and-comparison/>

0 commit comments

Comments
 (0)