GitHub Viewer
---
title: Java 10 新特性概览
category: Java
tag:
- Java新特性
---
**Java 10** 发布于 2018 年 3 月 20 日,最知名的特性应该是 `var` 关键字(局部变量类型推断)的引入了,其他还有垃圾收集器改善、GC 改进、性能提升、线程管控等一批新特性。
**概览(精选了一部分)** :
- [JEP 286:局部变量类型推断](https://openjdk.java.net/jeps/286)
- [JEP 304:垃圾回收器接口](https://openjdk.java.net/jeps/304)
- [JEP 307:G1 并行 Full GC](https://openjdk.java.net/jeps/307)
- [JEP 310:应用程序类数据共享(扩展 CDS 功能)](https://openjdk.java.net/jeps/310)
- [JEP 317:实验性的基于 Java 的 JIT 编译器](https://openjdk.java.net/jeps/317)
## 局部变量类型推断(var)
由于太多 Java 开发者希望 Java 中引入局部变量推断,于是 Java 10 的时候它来了,也算是众望所归了!
Java 10 提供了 `var` 关键字声明局部变量。
```java
var id = 0;
var codefx = new URL("https://mp.weixin.qq.com/");
var list = new ArrayList();
var list = List.of(1, 2, 3);
var map = new HashMap();
var p = Paths.of("src/test/java/Java9FeaturesTest.java");
var numbers = List.of("a", "b", "c");
for (var n : list)
System.out.print(n+ " ");
```
var 关键字只能用于带有构造器的局部变量和 for 循环中。
```java
var count=null; //❌编译不通过,不能声明为 null
var r = () -> Math.random();//❌编译不通过,不能声明为 Lambda表达式
var array = {1,2,3};//❌编译不通过,不能声明数组
```
var 并不会改变 Java 是一门静态类型语言的事实,编译器负责推断出类型。
另外,Scala 和 Kotlin 中已经有了 `val` 关键字 ( `final var` 组合关键字)。
相关阅读:[《Java 10 新特性之局部变量类型推断》](https://zhuanlan.zhihu.com/p/34911982)。
## 垃圾回收器接口
在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。 Java 10 通过引入一套纯净的垃圾收集器接口来将不同垃圾收集器的源代码分隔开。
## G1 并行 Full GC
从 Java9 开始 G1 就了默认的垃圾回收器,G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java9 的 G1 的 FullGC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收期在无法回收内存的时候触发 Full GC。
为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 FullGC 改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。
## 集合增强
`List`,`Set`,`Map` 提供了静态方法`copyOf()`返回入参集合的一个不可变拷贝。
```java
static List copyOf(Collection