zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    ZOJ 3818 Pretty Poem
    HDU 4597 Play Game
    HDU 4497 GCD and LCM
    CSU 1335 高桥和低桥
    UVA 10791 Minimum Sum LCM
    CSU 1119 Collecting Coins
    CSU 1120 病毒
    UVA 12169 Disgruntled Judge
    HDU 1301 Jungle Roads
    POJ 1258 Agri-Net
  • 原文地址:https://www.cnblogs.com/ding-dang/p/13569727.html
Copyright © 2011-2022 走看看