JDK9的这些新特征你知道吗?

  • 模块化系统
  • jShell命令
  • 接口的私有方法
  • 钻石操做符的使用升级
  • 垃圾收集机制
  • 语法改进:try语句
  • String存储结构变动
  • 建立只读集合
  • 加强的Stream API

1,Java平台模块化系统:

引入了一种新的Java编程组件模块,它是一个命名的、自描述的代码和数据集合。本质上说,模块(module)的概念,其实就是 package 外再包裹一层,也就是说,用模块来管理各个 package ,经过声明某个 package 暴露,不声明默认就是隐藏。所以模块化是的代码组织上更安全,由于它能够指定哪些部分暴露,哪些部分隐藏。java

过程:shell

① 建立一个 java9demo 的工程,而后在这个工程下面建立 2 个 module。一个 java9A ,一个 java9B编程

② 在 java9A 中建立一个实体类 Person,而后想在 java9B 中引用它,正常状况下是引用不到的,由于是存在两个模块中。安全

③ 咱们在 java9A 模块的 src 目录下新建 module-info.java 文件(这个文件就是所谓的模块化文件)session

module java9A {
 // 这里 exports 后面跟具体的包名
 exports com.hepingfly.bean;
}

④ 咱们在 java9B 模块的 src 目录下新建 module-info.java 文件模块化

module java9demo {
 // requires 后面跟具体要引入的 module 的名字
 requires java9A;
}

⑤ 这样在 java9B 模块中就能引用 java9A 模块暴露出来的实体类了。函数

public class ModuleTest {
 // 我在 java9B 模块中想引用 java9A 模块中的 Person 类
 public static void main(String[] args) {
        Person person = new Person();
        person.setName("hepingfly");
        System.out.println(person.getName());   // 打印 hepingfly
    }
}

模块化系统是基于jar包之间存在的,目的在于尽量的减小jar中多余类的加载,保证总体项目运行时的效率,对于项目运行确定有必定的积极意义。工具

二、JShell:

它表示 Java Shell,是你们熟知的 REPL (读取-执行-打印-循环) 形式。利用 jshell 能够在没有建立类的状况下直接声明变量,计算表达式,执行语句。即开发时能够在命令行里直接运行 Java 代码,无需建立 Java 文件。ui

基本使用:命令行

① JDK9 以上的版本若是你配置好了环境变量直接在命令行输入 jshell 便可进入交互界面缘由是 JDKbin 目录下有 jshell 这个工具)

② 输入命令得到帮助信息
【jshell> /help intro】输入 /help intro得到一些帮助信息

③ 定义变量,计算变量值

④ 定义方法,调用方法

⑤ 导入指定的包
【jshell> import java.util.*】能够经过import命令导入指定的包
【jshell> /imports】查看默认导入了哪些包

⑥ 列出当前 session 内全部有效的代码片断
【jshell> /list】判断当前session内全部有效的代码片断

⑦ 查看当前 session 下全部建立过的变量
【jshell> /var】

⑧ 查看当前 session 下全部建立过的方法
【jshell> /methods】

⑨ 从外部文件加载源代码

源代码:

// hello.java 文件中的内容
public void hello() {
 System.out.println("hello hepingfly");
}
hello();

⑩ 退出 jshell
【jshell> /exit】

注:

  • jshell 可使用 tab 键进行自动补全
  • jshell 能够从文件中加载语句或者将语句保存到文件中
  • 在 jshell 中定义相同方法名和参数列表的方法,即为对现有方法的覆盖。
  • 在 jshell 中你会发现不会出现编译时异常,由于 jshell 帮你隐藏了。

3,接口的私有方法:

jdk9,容许在接口中使用私有方法。在 Java9 中,接口更加灵活和强大,方法的访问权限修饰符能够声明为 private 的了,此时方法将不会成为你对外暴露的 API 的一部分。

//jdk9:声明私有方法
private void method4(){
     System.out.println("私有方法");
}

4,钻石操做符的使用升级

java9 添加了匿名内部类的功能 后面添加了大括号{} 能够作一些细节的操做

Map<String,String> map9 = new HashMap<>(){};

5,垃圾收集机制

Java 9 移除了在 Java 8 中 被废弃的垃圾回收器配置组合(DefNew + CMS,ParNew + SerialOld,Incremental CMS)

同时把G1设为默认的垃圾回收器实现。替代了以前默认使用的Parallel GC

JVM 有了统一的日志记录系统,可使用新的命令行选项-Xlog 来控制 JVM 上 全部组件的日志记录。该日志记录系统能够设置输出的日志消息的标签、级别、修饰符和输出目标等。

6,语法改进:try语句

在 Java9 中能够在 try 子句中使用已经初始化过的资源。

public void testJava() {
         /**
          * 能够在 try 后面的小括号中调用已经实例化好的资源对象
          * 多个资源对象以分号分隔
          */
         InputStreamReader is = new InputStreamReader(System.in);
         OutputStreamWriter os = new OutputStreamWriter(System.out);
         try (is;os) {
             System.out.println(is.read());
         } catch (Exception e) {
             e.printStackTrace();
         }
     }

7,String存储结构变动

String的实现底层由char[] 改成byte[],存储效率变高,调用效率一样变高

@Stable
private final byte[] value;

8,建立只读合集

public static void testJava() {
    // 建立一个只读的 list
    List<String> list = List.of("heping", "fly");
    // 建立一个只读的 set
    Set<String> set = Set.of("heping", "fly");
    // 建立一个只读的 map
    Map<String, String> map = Map.of("name", "heping", "age", "18");
    Map<String, String> map2 = Map.ofEntries(Map.entry("name", "heping"), Map.entry("age", "12"));
}

9,加强的Stream API

在 Java9 中,Stream API 变的更好,Stream 接口中添加了 4 个新的方法,dropWhiletakeWhileofNullable 、 还有个 iterator 方法的新重载方法。

  • takeWhile :用于从 Stream 中获取一部分数据,接收一个 predicate 来进行选择。在有序的 Stream 中,takeWhile 返回从开头开始的尽可能多的元素。

    public static void test1() {
        List<Integer> list = Arrays.asList(13,11,45,18,20,16,96);
        Stream<Integer> stream = list.stream();
        stream.takeWhile((x) -> x < 20).forEach(System.out::println);
    }
  • dropWhile:与 takeWhile() 整好相反,dropWhile返回剩余的元素。

    public static void test2() {
        List<Integer> list = Arrays.asList(13,11,45,18,20,16,96);
        Stream<Integer> stream = list.stream();
        stream.dropWhile((x) -> x < 20).forEach(System.out::println);
    }
  • ofNullable : 能够包含一个非空元素,也能够建立一个空 Stream 。

    public static void test3() {
        Stream<Integer> stream = Stream.of(1, 2, 3, null);
        stream.forEach(System.out::println);
        // 若是只有单个元素,此元素不能为 null,不然报空指针异常
        Stream<Object> stream1 = Stream.of(null);
        // Java9 新增 ofNullable 容许单个元素为空
        Stream<Object> stream2 = Stream.ofNullable(null);
        System.out.println(stream2.count());   // 0
    }
  • iterate:重载的方法

    public static void test4() {
      // 须要经过 limit 来控制终止
      Stream.iterate(0, x -> x + 1).limit(10).forEach(System.out::println);
      // 这里就能够经过传入一个断言型函数来进行终止
      Stream.iterate(0, x -> x < 10, x -> x + 1).forEach(System.out::println);
      }
相关文章
相关标签/搜索