Java 9 新特性

模块化系统(Modularity)

  • 本质上来讲,模块的概念就是在package外再裹一层,可以指定哪些部分可以暴露,哪些部分可以隐藏。

Java的REPL工具:jShell命令

  • 设计理念:即写即得,快速运行
  • REPL:read - evaluate - print - loop
  • 命令行输入jShell即可进入,输入/help可获得帮助

语法改进:接口的私有方法

  • 接口中的私有方法只能自己调用

钻石操作符的使用升级

  • 钻石操作符与匿名内部类在java 8中不能共存,现在可以了

语法改进:try语句

  • Java 8中,可以实现资源的自动关闭,但是要求执行后必须关闭的所有资源必须在try子句中初始化,否则编译不通过

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    try(InputStreamReader reader = new InputStreamReader(System.in)){
    char[] cbuf = new char[20];
    int len;
    if ((len = reader.read(cbuf)) != -1) {
    String str = new String(cbuf, 0, len);
    System.out.println(str);
    }
    } catch (IOException e) {
    throw new RuntimeException(e);
    }
  • Java 9中,可以在try子句中使用已经初始化过的资源,此时的资源是final的

1
2
3
4
5
6
7
8
9
10
11
InputStreamReader reader = new InputStreamReader(System.in);
try(reader){
char[] cbuf = new char[20];
int len;
if ((len = reader.read(cbuf)) != -1) {
String str = new String(cbuf, 0, len);
System.out.println(str);
}
} catch (IOException e) {
throw new RuntimeException(e);
}

String存储结构变更

  • String再也不同char[] 来存储了,改成了byte[]加上编码标记,节约了一些时间

集合工厂方法(创建只读集合)

  • Java 8中的写法
1
2
3
4
5
6
List<String> namesList = new ArrayList<>();
namesList.add("Joe");
namesList.add("Bob");
namesList.add("Bill");
namesList = Collections.unmodifiableList(namesList);
System.out.println(namesList);
  • Java 9
1
2
3
4
5
List<Integer> list1 = List.of(1, 2, 3, 4, 5);

Set<Integer> set1 = set.of(1, 2, 3, 4, 5);

...

InputStream加强

  • transferTo():把输入流中的所有数据直接自动地复制到输出流中

    1
    2
    3
    4
    5
    6
    7
    ClassLoader cl = this.getClass().getClassLoader();
    try(InputStream is = cl.getResourceAsStream("hello.txt");
    OutputStream os = new FileOutputStream("hello1.txt")){
    is.transferTo(os);
    } catch(IOException e){
    e.printStackTrace();
    }

增强的StreamAPI

takeWhile()的使用

  • 返回从开头开始的按照指定规则的尽量多的元素
1
2
List<Integer> list = Arrays.asList(23, 43, 23, 5, 123, 23, 1);
list.stream().takeWhile(x -> x < 60).forEach(System.out :: println);
  • dropWhile的行为与takeWhile相反,返回剩余的元素

ofNullable()的使用

  • 允许我们创建一个单元素Stream,可以包含一个非空元素,也可以创建一个空Stream

iterate()重载的使用

  • 提供一个Predicate(判断条件)来指定什么时候结束迭代
1
Stream.iterate(0, x -> x < 100, x -> x + 1).limit(10).forEach(System.out::println);

Optional类中stream()的使用

  • Optional类也可以使用stream()

Javascrip引擎升级:Nashorn

Java 10 新特性

局部变量类型推断

  • 声明变量时,根据所附的值,推断变量的类型
1
2
3
4
5
var num = 10;

var list = new ArrayList<String>();

...
  • 局部变量不赋值,就不能实现类型推断

  • Lambda表达式中不能使用类型推断

  • 方法引用中不能使用类型推断

  • 数组的静态初始化中,有些情况不能使用类型推断

  • 以下情况也不能使用类型推断

    没有初始化的局部变量声明

    方法的返回类型

    方法的参数类型

    构造器的参数类型

    属性

    catch块

集合新增创建不可变集合的方法

  • copeOf():创建一个只读的集合

Java 11 新特性

新增了一系列字符串的处理方法

  • isBlank(): 判断字符串是否为空白
  • strip():去除首尾空白
  • stripTrailing():去除尾部空白
  • stripLeading():去除首部空白
  • repeat(int num):复制字符串
  • lines().count():行数统计

Optional加强

  • boolean isEmpty():判断value是否为空
  • T ofElse Throw():value非空,返回value;否则抛异常
  • Streamstream():value非空,返回仅包含此value的Stream,否则返回一个空的Stream

局部变量类型推断的升级

  • 可以在var上添加注解
1
Consumer<String> con1 = (@Deprecated var t) -> System.out.println(t.toUpperCase());

全新的HTTP客户端API

  • HttpClient 替代HttpURLConnection

更简化的编译运行程序

  • 之前要运行一个Java源代码必须先编译再运行,现在通过一个Java命令就直接搞定了:

    java Javastack.java

废弃Nashorn引擎

ZGC

  • GC垃圾回收是java主要优势之一

  • ZGC是一个并发,基于region,压缩型的垃圾收集器,只有root扫描阶段会STW(stop the world)