---
title: Java 9 æ°ç¹æ§æ¦è§
category: Java
tag:
- Javaæ°ç¹æ§
---
**Java 9** åå¸äº 2017 å¹´ 9 æ 21 æ¥ ãä½ä¸º Java 8 ä¹å 3 å¹´åæåå¸çæ°çæ¬ï¼Java 9 带æ¥äºå¾å¤é大çååå
¶ä¸æéè¦çæ¹å¨æ¯ Java 平尿¨¡åç³»ç»çå¼å
¥ï¼å
¶ä»è¿æè¯¸å¦éåã`Stream` æµ......ã
ä½ å¯ä»¥å¨ [Archived OpenJDK General-Availability Releases](http://jdk.java.net/archive/) ä¸ä¸è½½èªå·±éè¦ç JDK çæ¬ï¼å®æ¹çæ°ç¹æ§è¯´æææ¡£å°åï¼https://openjdk.java.net/projects/jdk/ ã
**æ¦è§ï¼ç²¾éäºä¸é¨åï¼**ï¼
- [JEP 222: Java å½ä»¤è¡å·¥å
·](https://openjdk.java.net/jeps/222)
- [JEP 261: 模ååç³»ç»](https://openjdk.java.net/jeps/261)
- [JEP 248ï¼G1 æä¸ºé»è®¤åå¾åæ¶å¨](https://openjdk.java.net/jeps/248)
- [JEP 193: åé奿](https://openjdk.java.net/jeps/193)
- [JEP 254ï¼å符串åå¨ç»æä¼å](https://openjdk.java.net/jeps/254)
## JShell
JShell æ¯ Java 9 æ°å¢çä¸ä¸ªå®ç¨å·¥å
·ã为 Java æä¾äºç±»ä¼¼äº Python ç宿¶å½ä»¤è¡äº¤äºå·¥å
·ã
å¨ JShell ä¸å¯ä»¥ç´æ¥è¾å
¥è¡¨è¾¾å¼å¹¶æ¥çå
¶æ§è¡ç»æã

**JShell 为æä»¬å¸¦æ¥äºåªäºå¥½å¤å¢ï¼**
1. éä½äºè¾åºç¬¬ä¸è¡ Java ç"Hello Worldï¼"ç鍿§ï¼è½å¤æé«æ°æçå¦ä¹ çæ
ã
2. å¨å¤çç®åçå°é»è¾ï¼éªè¯ç®åçå°é®é¢æ¶ï¼æ¯ IDE æ´ææçï¼å¹¶ä¸æ¯ä¸ºäºå代 IDEï¼å¯¹äºå¤æé»è¾çéªè¯ï¼IDE æ´åéï¼ä¸¤è
äºè¡¥ï¼ã
3. ......
**JShell ç代ç åæ®éçå¯ç¼è¯ä»£ç ï¼æä»ä¹ä¸ä¸æ ·ï¼**
1. 䏿¦è¯å¥è¾å
¥å®æï¼JShell ç«å³å°±è½è¿åæ§è¡çç»æï¼èä¸åéè¦ç¼è¾å¨ãç¼è¯å¨ãè§£éå¨ã
2. JShell æ¯æåéçéå¤å£°æï¼åé¢å£°æçä¼è¦çåé¢å£°æçã
3. JShell æ¯æç¬ç«çè¡¨è¾¾å¼æ¯å¦æ®éçå æ³è¿ç® `1 + 1`ã
4. ......
## 模ååç³»ç»
模åç³»ç»æ¯[Jigsaw Project](https://openjdk.java.net/projects/jigsaw/)çä¸é¨åï¼ææ¨¡ååå¼åå®è·µå¼å
¥å°äº Java å¹³å°ä¸ï¼å¯ä»¥è®©æä»¬ç代ç å¯éç¨æ§æ´å¥½ï¼
**ä»ä¹æ¯æ¨¡åç³»ç»ï¼** 宿¹çå®ä¹æ¯ï¼
> A uniquely named, reusable group of related packages, as well as resources (such as images and XML files) and a module descriptorã
ç®åæ¥è¯´ï¼ä½ å¯ä»¥å°ä¸ä¸ªæ¨¡åç使¯ä¸ç»å¯ä¸å½åãå¯éç¨çå
ãèµæºå模åæè¿°æä»¶ï¼`module-info.java`ï¼ã
ä»»æä¸ä¸ª jar æä»¶ï¼åªè¦å ä¸ä¸ä¸ªæ¨¡åæè¿°æä»¶ï¼`module-info.java`ï¼ï¼å°±å¯ä»¥å级为ä¸ä¸ªæ¨¡åã

å¨å¼å
¥äºæ¨¡åç³»ç»ä¹åï¼JDK è¢«éæ°ç»ç»æ 94 个模åãJava åºç¨å¯ä»¥éè¿æ°å¢ç **[jlink](http://openjdk.java.net/jeps/282) å·¥å
·** (Jlink æ¯é Java 9 ä¸èµ·åå¸çæ°å½ä»¤è¡å·¥å
·ãå®å
许å¼å人å为åºäºæ¨¡åç Java åºç¨ç¨åºå建èªå·±çè½»é级ãå®å¶ç JRE)ï¼å建åºåªå
嫿ä¾èµç JDK 模åçèªå®ä¹è¿è¡æ¶éåãè¿æ ·å¯ä»¥æå¤§çåå° Java è¿è¡æ¶ç¯å¢ç大å°ã
æä»¬å¯ä»¥éè¿ `exports` å
³é®è¯ç²¾åæ§å¶åªäºç±»å¯ä»¥å¯¹å¤å¼æ¾ä½¿ç¨ï¼åªäºç±»åªè½å
é¨ä½¿ç¨ã
```java
module my.module {
//exports å
¬å¼æå®å
çææå
Œ
±æå
exports com.my.package.name;
}
module my.module {
//exportsâ¦to éå¶è®¿é®çæåèå´
export com.my.package.name to com.specific.package;
}
```
æ³è¦æ·±å
¥äºè§£ Java 9 çæ¨¡ååï¼å¯ä»¥åèä¸é¢è¿å ç¯æç« ï¼
- [ãProject Jigsaw: Module System Quick-Start Guideã](https://openjdk.java.net/projects/jigsaw/quick-start)
- [ãJava 9 Modules: part 1ã](https://stacktraceguru.com/java9/module-introduction)
- [Java 9 æç§ï¼2. 模ååç³»ç»ï¼](http://www.cnblogs.com/IcanFixIt/p/6947763.html)
## G1 æä¸ºé»è®¤åå¾åæ¶å¨
å¨ Java 8 çæ¶åï¼é»è®¤åå¾åæ¶å¨æ¯ Parallel Scavengeï¼æ°ç代ï¼+Parallel Oldï¼è年代ï¼ãå°äº Java 9, CMS åå¾åæ¶å¨è¢«åºå¼äºï¼**G1ï¼Garbage-First Garbage Collectorï¼** æä¸ºäºé»è®¤åå¾åæ¶å¨ã
G1 è¿æ¯å¨ Java 7 ä¸è¢«å¼å
¥çï¼ç»è¿ä¸¤ä¸ªçæ¬ä¼å¼çè¡¨ç°æä¸ºæä¸ºé»è®¤åå¾åæ¶å¨ã
## å¿«éå建ä¸å¯åéå
å¢å äº`List.of()`ã`Set.of()`ã`Map.of()` å `Map.ofEntries()`çå·¥åæ¹æ³æ¥å建ä¸å¯åéåï¼æç¹åè Guava çå³éï¼ï¼
```java
List.of("Java", "C++");
Set.of("Java", "C++");
Map.of("Java", 1, "C++", 2);
```
ä½¿ç¨ `of()` å建çéå为ä¸å¯åéåï¼ä¸è½è¿è¡æ·»å ãå é¤ãæ¿æ¢ã æåºçæä½ï¼ä¸ç¶ä¼æ¥ `java.lang.UnsupportedOperationException` å¼å¸¸ã
## String åå¨ç»æä¼å
Java 8 åä¹åççæ¬ï¼`String` ä¸ç´æ¯ç¨ `char[]` åå¨ãå¨ Java 9 ä¹åï¼`String` çå®ç°æ¹ç¨ `byte[]` æ°ç»åå¨å符串ï¼èçäºç©ºé´ã
```java
public final class String implements java.io.Serializable,Comparable, CharSequence {
// @Stable 注解表示åéæå¤è¢«ä¿®æ¹ä¸æ¬¡ï¼ç§°ä¸ºâ稳å®çâã
@Stable
private final byte[] value;
}
```
## æ¥å£ç§ææ¹æ³
Java 9 å
è®¸å¨æ¥å£ä¸ä½¿ç¨ç§ææ¹æ³ãè¿æ ·çè¯ï¼æ¥å£ç使ç¨å°±æ´å çµæ´»äºï¼æç¹åæ¯ä¸ä¸ªç®åççæ½è±¡ç±»ã
```java
public interface MyInterface {
private void methodPrivate(){
}
}
```
## try-with-resources å¢å¼º
å¨ Java 9 ä¹åï¼æä»¬åªè½å¨ `try-with-resources` åä¸å£°æåéï¼
```java
try (Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) {
// omitted
}
```
å¨ Java 9 ä¹åï¼å¨ `try-with-resources` è¯å¥ä¸å¯ä»¥ä½¿ç¨ effectively-final åéã
```java
final Scanner scanner = new Scanner(new File("testRead.txt"));
PrintWriter writer = new PrintWriter(new File("testWrite.txt"))
try (scanner;writer) {
// omitted
}
```
**ä»ä¹æ¯ effectively-final åéï¼** ç®åæ¥è¯´å°±æ¯æ²¡æè¢« `final` ä¿®é¥°ä½æ¯å¼å¨åå§åå仿ªæ´æ¹çåéã
æ£å¦ä¸é¢çä»£ç ææ¼ç¤ºç飿 ·ï¼å³ä½¿ `writer` åéæ²¡æè¢«æ¾ç¤ºå£°æä¸º `final`ï¼ä½å®å¨ç¬¬ä¸æ¬¡è¢«å¤å¶åå°±ä¸ä¼æ¹åäºï¼å æ¤ï¼å®å°±æ¯ effectively-final åéã
## Stream & Optional å¢å¼º
`Stream` ä¸å¢å äºæ°çæ¹æ³ `ofNullable()`ã`dropWhile()`ã`takeWhile()` 以å `iterate()` æ¹æ³çéè½½æ¹æ³ã
Java 9 ä¸ç `ofNullable()` æ¹ æ³å
许æä»¬å建ä¸ä¸ªåå
ç´ ç `Stream`ï¼å¯ä»¥å
å«ä¸ä¸ªé空å
ç´ ï¼ä¹å¯ä»¥å建ä¸ä¸ªç©º `Stream`ã èå¨ Java 8 ä¸åä¸å¯ä»¥å建空ç `Stream` ã
```java
Stream stringStream = Stream.ofNullable("Java");
System.out.println(stringStream.count());// 1
Stream nullStream = Stream.ofNullable(null);
System.out.println(nullStream.count());//0
```
`takeWhile()` æ¹æ³å¯ä»¥ä» `Stream` ä¸ä¾æ¬¡è·å满足æ¡ä»¶çå
ç´ ï¼ç´å°ä¸æ»¡è¶³æ¡ä»¶ä¸ºæ¢ç»æè·åã
```java
List integerList = List.of(11, 33, 66, 8, 9, 13);
integerList.stream().takeWhile(x -> x integerList2 = List.of(11, 33, 66, 8, 9, 13);
integerList2.stream().dropWhile(x -> x Stream iterate(final T seed, final UnaryOperator f) {
}
// æ°å¢å çéè½½æ¹æ³
public static Stream iterate(T seed, Predicate super T> hasNext, UnaryOperator next) {
}
```
两è
ç使ç¨å¯¹æ¯å¦ä¸ï¼æ°ç `iterate()` éè½½æ¹æ³æ´å çµæ´»ä¸äºã
```java
// 使ç¨åå§ iterate() æ¹æ³è¾åºæ°å 1~10
Stream.iterate(1, i -> i + 1).limit(10).forEach(System.out::println);
// ä½¿ç¨æ°ç iterate() éè½½æ¹æ³è¾åºæ°å 1~10
Stream.iterate(1, i -> i i + 1).forEach(System.out::println);
```
`Optional` ç±»ä¸æ°å¢äº `ifPresentOrElse()`ã`or()` å `stream()` çæ¹æ³
`ifPresentOrElse()` æ¹æ³æ¥åä¸¤ä¸ªåæ° `Consumer` å `Runnable` ï¼å¦æ `Optional` ä¸ä¸ºç©ºè°ç¨ `Consumer` åæ°ï¼ä¸ºç©ºåè°ç¨ `Runnable` åæ°ã
```java
public void ifPresentOrElse(Consumer super T> action, Runnable emptyAction)
Optional