jdk10和11新特性

jdk10特性

局部类型推断

产生背景:开发者经常抱怨Java中引用代码的程度。局部变量的显示类型声明,常常被认为是是不必须的,给一个好听的名字经常可以很清楚的表达出下面应该怎样继续。

好处:减少了啰嗦和形式的代码,避免了信息冗余,而且对齐了变量名,更容易阅读!

使用:var关键字

测试

    public static void main(String[] args) {
        //声明变量时,根据所赋的值,推断变量的类型
        var num = 10;
        var str = "string";
        var str2 = "string2";
        System.out.println(str instanceof String);
        var list = new ArrayList<String>();
        //list.add(num);  //本行编译不通过
        list.add(str);
        list.add(str2);
        for (var o : list) {
            System.out.println(o);
        }
    }

image-20210421133714614

上述代码字节码反编译后:

image-20210421135051190

不适用局部类型推断的情况

image-20210421134446535

方法返回值:

image-20210421134616161

方法参数类型:

image-20210421134647997

构造器参数类型:

image-20210421134754837

类的属性:

image-20210421134848662

catch块:

image-20210421134931079

工作原理

在处理var时,编译器先是查看表达式右边部分,并根据右边变量值的类型进行推断,作为左边变量的类型,然后将该类型写入字节码当中。

注意:var不是一个关键字

你不需要担心变量名或方法名会与var发生冲突,因为var实际上并不是一个关键字,而是一个类型名,只有在编译器需要知道类型的地方才需要用到它。除此之外,它就是一个普通合法的标识符。也就是说,除了不能用它作为类名,其他的都可以,但极少人会用它作为类名。

集合新增不可变集合API

List.copyOf:创建一个只读集合

此外不只List有,Set和Map都添加了该API

    public static void main(String[] args) {
        //jdk9新特性 List.of
        var list1 = List.of("java","spring","js");
        //jdk10新特性 List.copyOf
        var list2 = List.copyOf(list1);
        System.out.println(list1 == list2);

        var list3 = new ArrayList<>();
        var list4 = List.copyOf(list3);
        System.out.println(list3 == list4);
    }

image-20210421135926240

为什么一个true一个false?

源码如下:当原集合是只读集合就直接返回,否则创建一个新的只读集合并返回。而List.of创建的就是只读集合,不可修改。

image-20210421140037163

jdk11特性

jdk11是一个长期支持的版本

新增字符串API

判断是否为空:isBlank

去除首尾空格:strip

去除尾部空格:stripTrailing

去除首部空格:stripLeading

复制字符串:repeat

行数统计:lines

    public static void main(String[] args) {
        System.out.println("  
  	  ".isBlank());
        System.out.println("--"+"  
  	  ".strip()+"--");
        System.out.println("--"+"  java  ".stripTrailing()+"--");
        System.out.println("--"+"  java  ".stripLeading()+"--");
        System.out.println("  java".repeat(2));
        System.out.println("  
  	  ".lines().count());
    }

image-20210421141639897

Optional新增API

image-20210421141925789

        Optional<Object> op = Optional.empty();
        System.out.println(op.isEmpty());//判断内部value是否为空
        System.out.println(op.isPresent());//判断内部value是否存在

        var op2 = Optional.of("op");
        System.out.println(op2.orElseThrow());

        var o = op.orElseThrow();

image-20210421142403226

局部类型推断升级

在var上添加注解的语法格式,在jdk10中不能实现,在jdk11中加入了该语法。

image-20210421142749054

HttpClient

image-20210421142923360

    public static void main(String[] args) {
        aSync();
        sync();
    }

    /**
     * 同步调用
     * @author wen.jie
     * @date 2021/4/21 14:45
     */
    private static void sync() {
        try {
            HttpClient client = HttpClient.newHttpClient();
            HttpRequest request = HttpRequest.newBuilder(URI.create("http://www.baidu.com")).build();
            HttpResponse.BodyHandler<String> bodyHandler = HttpResponse.BodyHandlers.ofString();
            HttpResponse<String> response = client.send(request, bodyHandler);
            String body = response.body();
            System.out.println(body);
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

    }

    /**
     * 异步调用
     * @author wen.jie
     * @date 2021/4/21 14:45
     */
    private static void aSync() {
        try {
            HttpClient client = HttpClient.newHttpClient();
            HttpRequest request = HttpRequest.newBuilder(URI.create("http://www.baidu.com")).build();
            HttpResponse.BodyHandler<String> bodyHandler = HttpResponse.BodyHandlers.ofString();
            CompletableFuture<HttpResponse<String>> completableFuture = client.sendAsync(request, bodyHandler);
            HttpResponse<String> response = completableFuture.get();
            String body = response.body();
            System.out.println(body);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }

image-20210421145057604

更简化的编译运行

以往我们运行代码要经过两部,先javac,再java

现在只需要一步,只需要一个java命令就行了。

我在桌面上放了一个Hello.java文件,内容很简单,输出Hello

image-20210421150239390

运行这个文件很简单:

java Hello.java

image-20210421150331984

一个命令编译运行源代码的注意点:

  • 执行源文件中的第一个类,第一个类必须包含主方法。
  • 并且不可以使用其它源文件中的自定义类,本文件中的自定义类是可以使用的。

废弃Nashorn引擎

废除Nashorn javascript引擎,在后续版本准备移除掉,有需要的可以考虑使用GraalVM。

ZGC

GC是java主要优势之一。然而,当GC停顿太长,就会开始影响应用的响应时间。消除或者减少GC停顿时长,java将对更广泛的应用场景是一个更有吸引力的平台。此外,现代系统中可用内存不断增长,用户和程序员希望JVM能够以高效的方式充分利用这些内存,并且无需长时间的GC暂停时间。

ZGC,A Scalable Low-Latency Garbage Collector (Experimental) ZGC,这应该是JDK11最为瞩目的特性,没有之一。但是后面带了Experimental,说明这还不建议用到生产环境。

ZGC是一个并发,基于region,压缩型的垃圾收集器,只有root扫描阶段会STW(stop the world),因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。

优势:

  • GC暂停时间不会超过10ms
  • 既能处理几百兆的小堆,也能处理几个T的大堆(OMG)
  • 和G1相比,应用吞吐能力不会下降超过15%
  • 为未来的GC功能和利用colord指针以及Load barriers优化奠定基础
  • 初始只支持64位系统

ZGC的设计目标是:支持TB级内存容量,暂停时间低(<10ms),对整个程序吞吐量的影响小于15%。将来还可以扩展实现机制,以支持不少令人兴奋的功能,例如多层堆(即热对象置于DRAM和冷对象置于NVMe闪存),或压缩堆。

其他新特性

image-20210421151258337

原文地址:https://www.cnblogs.com/wwjj4811/p/14685373.html