• Java11新特性


    局部变量类型推断增强

    Java11中可以在lambda表达式的形参中使用var,好处是可以在形参上加注解

    使用示例

    (@Deprecated var x, @Nullable var y)->x.process(y)

    API增强

    不可修改集合API

    //Jdk 里面为集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它们两个都用来创建不可变的集合
    //示例1
    var list = List.of("Java", "Python", "C");
    var copy = List.copyOf(list);
    System.out.println(list == copy); // true
    
    //示例2
    var list = new ArrayList<String>();
    var copy = List.copyOf(list);
    System.out.println(list == copy); // false
    
    //示例1和2代码差不多,为什么一个为true,一个为false?
    //源码部分
    static <E> List<E> of(E... elements) {
      switch (elements.length) { // implicit null check of elements
        case 0:
            return ImmutableCollections.emptyList();
        case 1:
            return new ImmutableCollections.List12<>(elements[0]);
        case 2:
            return new ImmutableCollections.List12<>(elements[0], elements[1]);
        default:
            return new ImmutableCollections.ListN<>(elements);
      }
    }
    static <E> List<E> copyOf(Collection<? extends E> coll) {
        return ImmutableCollections.listCopy(coll);
    }
    static <E> List<E> listCopy(Collection<? extends E> coll) {
        if (coll instanceof AbstractImmutableList && coll.getClass() != SubList.class) {
            return (List<E>)coll;
        } else {
            return (List<E>)List.of(coll.toArray());
        }
    }
    
    /**
     * 可以看出 copyOf 方法会先判断来源集合是不是 AbstractImmutableList 类型的,如果是,就直接返回,如果不是,则调用 of 创建一个新的集合。
     * 示例2因为用的 new 创建的集合,不属于不可变 AbstractImmutableList 类的子类,所以 copyOf 方法又创建了一个新的实例,所以为false.
     * 注意:使用of和copyOf创建的集合为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。
     * 上面演示了 List 的 of 和 copyOf 方法,Set 和 Map 接口都有
     */
    

    Stream 加强

    //1) 增加单个参数构造方法,可为null
    Stream.ofNullable(null).count(); // 0
    //2) 增加 takeWhile 和 dropWhile 方法
    Stream.of(1, 2, 3, 2, 1)
    .takeWhile(n -> n < 3)
    .collect(Collectors.toList()); // [1, 2]
    //从开始计算,当 n < 3 时就截止。
    
    Stream.of(1, 2, 3, 2, 1)
    .dropWhile(n -> n < 3)
    .collect(Collectors.toList()); // [3, 2, 1]
    //这个和上面的相反,一旦 n < 3 不成立就开始计算。
    
    //3)iterate重载
    //这个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代
    

    增加了一系列字符串处理的方法

    // 判断字符串是否为空白
    " ".isBlank(); // true
    // 去除首尾空白
    " Javastack ".strip(); // "Javastack"
    // 去除尾部空格
    " Javastack ".stripTrailing(); // " Javastack"
    // 去除首部空格
    " Javastack ".stripLeading(); // "Javastack "
    // 复制字符串
    "Java".repeat(3);// "JavaJavaJava"
    // 行数统计
    "A
    B
    C".lines().count(); // 3
    

    Optional增强

    //Opthonal 也增加了几个非常酷的方法,现在可以很方便的将一个 Optional 转换成一个 Stream, 或者当一个空 Optional 时给它一个替代的。
    Optional.of("javastack").orElseThrow(); // javastack
    Optional.of("javastack").stream().count(); // 1
    Optional.ofNullable(null)
    .or(() -> Optional.of("javastack"))
    .get(); // javastack
    

    InputStream加强

    //InputStream 终于有了一个非常有用的方法:transferTo,可以用来将数据直接传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法,如下示例
    var classLoader = ClassLoader.getSystemClassLoader();
    var inputStream = classLoader.getResourceAsStream("javastack.txt");
    var javastack = File.createTempFile("javastack2", "txt");
    try (var outputStream = new FileOutputStream(javastack)) {
        inputStream.transferTo(outputStream);
    }
    

    移除的一些内容

    //移除项
    移除了com.sun.awt.AWTUtilities
    移除了sun.misc.Unsafe.defineClass,
    使用java.lang.invoke.MethodHandles.Lookup.defineClass来替代
    移除了Thread.destroy()以及 Thread.stop(Throwable)方法
    移除了sun.nio.ch.disableSystemWideOverlappingFileLockCheck、sun.locale.formatasdefault属性
    移除了jdk.snmp模块
    移除了javafx,openjdk估计是从java10版本就移除了,oracle jdk10还尚未移除javafx,而java11版本则oracle的jdk版本也移除了javafx
    移除了Java Mission Control,从JDK中移除之后,需要自己单独下载
    移除了这些Root Certificates :Baltimore Cybertrust Code Signing CA,SECOM ,AOL and Swisscom
    //废弃项
    -XX+AggressiveOpts
    -XX:+UnlockCommercialFeatures
    -XX:+LogCommercialFeatures
    
    

    标准Java异步HTTP客户端

    /**
     * 这是 Java 9 开始引入的一个处理 HTTP 请求的的 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到这个 API
     */
    var request = HttpRequest.newBuilder().uri(URI.create("https://javastack.cn")).GET().build();
    var client = HttpClient.newHttpClient();
    // 同步
    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.body());
    // 异步
    client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
          .thenApply(HttpResponse::body)
          .thenAccept(System.out::println);
    
    

    更简化的编译运行程序

    // 之前编译运行的流程
    // 编译
    javac Javastack.java
    // 运行
    java Javastack
    
    /**
     * Java11之后一行命令
     * 使用条件:
     * 1)	执行源文件中的第一个类, 第一个类必须包含主方法
     * 2)	并且不可以使用别源文件中的自定义类, 本文件中的自定义类是可以使用的
    */
    java Javastack.java
    
    

    Unicode 10

    Unicode 10 增加了8518个字符, 总计达到了136690个字符. 并且增加了4个脚本.同时还有56个新的emoji表情符号
    

    Remove the JavaEE and CORBA Moudles

    在java11中移除了不太使用的JavaEE模块和CORBA技术
    
    CORBA来自于二十世纪九十年代,Oracle说,现在用CORBA开发现代Java应用程序已经没有意义了,维护CORBA的成本已经超过了保留它带来的好处。
    
    但是删除CORBA将使得那些依赖于JDK提供部分CORBA API的CORBA实现无法运行。目前还没有第三方CORBA版本,也不确定是否会有第三方愿意接手CORBA API的维护工作。
    
    在java11中将java9标记废弃的Java EE及CORBA模块移除掉,具体如下:
          (1)xml相关的,
                            java.xml.ws, 
                            java.xml.bind,
                            java.xml.ws,
                            java.xml.ws.annotation,
                            jdk.xml.bind,
                            jdk.xml.ws被移除,
                            只剩下java.xml,java.xml.crypto,jdk.xml.dom这几个模块
          (2)java.corba
                            java.se.ee,
                            java.activation,
                            java.transaction被移除,
                            但是java11新增一个java.transaction.xa模块
    

    Epsilon垃圾收集器

    A NoOp Garbage Collector
    JDK上对这个特性的描述是: 开发一个处理内存分配但不实现任何实际内存回收机制的GC, 一旦可用堆内存用完, JVM就会退出.
    如果有System.gc()调用, 实际上什么也不会发生(这种场景下和-XX:+DisableExplicitGC效果一样), 因为没有内存回收, 这个实现可能会警告用户尝试强制GC是徒劳
    
    用法 : -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC
    
    使用这个选项的原因 :
    提供完全被动的GC实现, 具有有限的分配限制和尽可能低的延迟开销,但代价是内存占用和内存吞吐量.
    众所周知, java实现可广泛选择高度可配置的GC实现. 各种可用的收集器最终满足不同的需求, 即使它们的可配置性使它们的功能相交. 有时更容易维护单独的实现, 而不是在现有GC实现上堆积另一个配置选项.
    
    主要用途如下 :
    	性能测试(它可以帮助过滤掉GC引起的性能假象)
    	内存压力测试(例如,知道测试用例 应该分配不超过1GB的内存, 我们可以使用-Xmx1g –XX:+UseEpsilonGC, 如果程序有问题, 则程序会崩溃)
    	非常短的JOB任务(对象这种任务, 接受GC清理堆那都是浪费空间)
    	VM接口测试
    	Last-drop 延迟&吞吐改进
    

    ZGC, 这应该是JDK11最为瞩目的特性, 没有之一. 但是后面带了Experimental, 说明这还不建议用到生产环境,这里简单介绍,稍后单独介绍ZGC

    ZGC的特点:
            GC暂停时间不会超过10ms
    	既能处理几百兆的小堆, 也能处理几个T的大堆(OMG)
    	和G1相比, 应用吞吐能力不会下降超过15%
    	为未来的GC功能和利用colord指针以及Load barriers优化奠定基础
    	初始只支持64位系统
    用法:
            -XX:+UnlockExperimentalVMOptions –XX:+UseZGC
    
  • 相关阅读:
    PAT乙级题库“傻瓜”题解之跟奥巴马一起编程
    PAT乙级题库“傻瓜”题解之划拳
    PAT乙级题库“傻瓜”题解之数素数
    PAT乙级题库“傻瓜”题解之编程团体赛
    PAT乙级题库“傻瓜”题解之判断题
    PAT乙级题库“傻瓜”题解之输出PATest
    有始有终,后会无期。
    今日德语大学习
    【day
    [day 3] Deutsch Studie
  • 原文地址:https://www.cnblogs.com/ding-dang/p/13569727.html
Copyright © 2020-2023  润新知