JDK9-17新特性

一.JDK9新特性

1.模块系统

      用模块来管理各个package,通过声明某个package暴露,模块(module)的概念,其实就是package外再裹一层,不声明默认就是隐藏。因此,模块化使得代码组织上更安全,因为它可以指定哪些部分可以暴露,哪些部分隐藏。

实现目标

  1. 模块化的主要目的在于减少内存的开销

  2. 只须必要模块,而非全部jdk模块,可简化各种类库和大型应用的开发和维护

  3. 改进 Java SE 平台,使其可以适应不同大小的计算设备

  4. 改进其安全性,可维护性,提高性能

 2.JShell

        Jshell是在JDK 9中引入的一个交互式的命令行工具,可以运行代码片段并立即显示运行结果。

3.接口私有方法

        在Java 9中,接口更加的灵活和强大,连方法的访问权限修饰符可以声明为private,此时方法将不会成为你对外暴露的API的一部分。

public interface JDK9Demo4 {
    //接口默认都是共有静态常量
    public static final int NUM = 10;
    //接口默认方法都是抽象方法
    public abstract void method1();

    //jdk8接口可以有静态方法
    public static void method2(){
        System.out.println("接口中的静态方法");
    }
    //jdk8接口可以有默认方法
    public default void method3(){
        System.out.println("接口中的默认方法");
    }
    //jdk9接口可以有私有方法
    private void method4(){
        System.out.println("接口中的私有方法");
    }
}

4.钻石操作符

        在jdk8中,下面的代码会报错,而在jdk9中代码是正确的。

Comparator<Object> com = new Comparator<>() {
    @Override
    public int compare(Object o1, Object o2) {
        return 0;
    }
};

5.try 语句

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

Java 9 中,用资源语句编写try将更容易,我们可以在try子句中使用已经初始化过的资源,此时的资源是final的 ,不可再被赋值。

6.String 存储结构

String 不用 char[] 来存储,改成了 byte[] 加上编码标记,节约了一些空间。

7.集合特性of()

在jdk8中,创建一个只读、不可改变的集合,必须构造和分配它,然后添加元素,最后包装成一个不可修改的集合。 它并不能表达为单个的表达式。

Java 9因此引入了方便的方法,这使得类似的事情更容易表达。

8.InputStream增强

InputStream 有了一个非常有用的方法:transferTo,可以用来将数据直接传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法。

9.Stream API增强

        在 Java 9 中,Stream API 变得更好,Stream 接口中添加了 4 个新的方法:takeWhile, dropWhile, ofNullable,还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。

10.Optional 类中stream()使用

public static void main(String[] args) throws Exception {
    List<String> list = new ArrayList<>();
    list.add("张三");
    list.add("李四");
    list.add("王五");
    list.add("赵六");
    Optional<List<String>> optional = Optional.ofNullable(list);
    optional.stream().flatMap(x->x.stream()).limit(2).forEach(System.out::println);

    list.stream().limit(2).forEach(System.out::println);
}

二.JDK10 新特性

1.局部变量类型推断

//1.局部变量初始化
var list = new ArrayList<>();
//2.增强for循环中的索引
for(var v:list){
    System.out.println(v)
}
//3.传统for循环
for(var i = 0;i<100;i++){
    System.out.println(i)
}

但局部变量在下面的情况中不适用:

  1. 初始值为null
  2. 方法引用
  3. Lambda表达式
  4. 数组静态化

 2.新增不可变集合方法

        自 Java 9 开始,Jdk 里面为集合(List / Set / Map)都添加了 of (jdk9新增)和copyOf (jdk10新增)方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别。

public static void main(String[] args) throws Exception {
    //示例1
    var list1 = List.of("AA","BB","CC");
    var list2 = List.copyOf(list1);
    System.out.println(list1==list2);//true
    //示例2
    var list3 = new ArrayList<String>();
    list3.add("AA");
    list3.add("BB");
    List<String> list4 = List.copyOf(list3);
    System.out.println(list3==list4); //false
}

三.JDK 11新特性

1.增加ZGC垃圾回收器

        ZGC, 这应该是JDK11最为瞩目的特性。 ZGC是一个并发, 基于region, 压缩型的垃圾收集器, 只有root扫描阶段会STW, 因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。

优势:

  • GC暂停时间不会超过10ms

  • 既能处理几百兆的小堆, 也能处理几个T的大堆(OMG)

  • 和G1相比, 应用吞吐能力不会下降超过15%

  • 为未来的GC功能和利用colord指针以及Load barriers优化奠定基础

  • 初始只支持64位系统

2. Optional加强

 3.新增HTTP客户端API

        Java 9 开始引入的一个处理 HTTP 请求的的 HTTP Client API,该API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在java.net 包中找到这个 API。

四.JDK 14 新特性

改进的NullPointerExceptions,jdk14的空指针异常会更加具体。

五.JDK 15新特性

在JDK 15新增加了文本块。

六.JDK 16 新特性

在Java16中正式发布Switch升级,其目的是为了解决switch语句的一些不规则性成为障碍

  • 比如case标签之间的默认控制行为

  • case块中的默认范围

  • 无意义的break语句。

jdk16以前switch结构用法 :

public static void main(String[] args) {
    int level = new Random().nextInt(4);
    String strLevel;
    switch (level){
        case 1:
            strLevel = "优秀";
            break;
        case 2:
            strLevel = "良好";
            break;
        default:
            strLevel = "一般";
            break;
    }
    System.out.println(strLevel);
}

jdk16对应用法 :

public static void main(String[] args) {
    int level = new Random().nextInt(4);
    String strLevel;
    switch (level){
        case 1 -> strLevel="优秀";
        case 2 -> strLevel="良好";
        default -> strLevel="一般";
    }
    System.out.println(strLevel);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值