• 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

  • 相关阅读:
    7、python数据类型之集合set
    python基本数据类型练习
    matplotlib
    numpy常用函数
    pillow包
    keras-tensorflow版本对应
    python-激活和切换运行环境
    端口监控
    numpy
    低风险创业笔记
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14685373.html
Copyright © 2020-2023  润新知