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

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

1,Java平台模块化系统:

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

过程:

① 创建一个 java9demo 的工程,然后在这个工程下面创建 2 个 module。一个 java9A ,一个 java9B

② 在 java9A 中创建一个实体类 Person,然后想在 java9B 中引用它,正常情况下是引用不到的,因为是存在两个模块中。

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

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中多余类的加载,保证整体项目运行时的效率,对于项目运行肯定有一定的积极意义。

2、JShell:

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

基本使用:

① 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 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 list = List.of("heping", "fly");
    // 创建一个只读的 set
    Set set = Set.of("heping", "fly");
    // 创建一个只读的 map
    Map map = Map.of("name", "heping", "age", "18");
    Map 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 list = Arrays.asList(13,11,45,18,20,16,96);
        Stream stream = list.stream();
        stream.takeWhile((x) -> x < 20).forEach(System.out::println);
    }
  • dropWhile:与 takeWhile() 整好相反,dropWhile返回剩余的元素。

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

    public static void test3() {
        Stream stream = Stream.of(1, 2, 3, null);
        stream.forEach(System.out::println);
        // 如果只有单个元素,此元素不能为 null,否则报空指针异常
        Stream stream1 = Stream.of(null);
        // Java9 新增 ofNullable 允许单个元素为空
        Stream 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);
      }
  • 你可能感兴趣的:(java)