zoukankan      html  css  js  c++  java
  • JDK10、JDK11、JDK12新特性

    JDK10新特性

    1、var声明变量

    很多人抱怨Java是一种强类型,需要引入大量的样板代码。甚至在这些情况下,给定好变量名,通常很清楚发生了什么,明显类型声明往往被认为是不必要的。许多流行的编程语言都已经支持某种形式的局部变量类型推断:如C++ (auto), C# (var), Scala (var/val), Go (declaration with :=)等。

    JDK10 可以使用var作为局部变量类型推断标识符,此符号仅适用于局部变量,增强for循环的索引,以及传统for循环的本地变量;它不能使用于方法形式参数,构造函数形式参数,方法返回类型,字段,catch形式参数或任何其他类型的变量声明。

    标识符var不是关键字;相反,它是一个保留的类型名称。这意味着var用作变量,方法名或则包名称的代码不会受到影响;但var不能作为类或则接口的名字(但这样命名是比较罕见的,因为他违反了通常的命名约定,类和接口首字母应该大写)。

    参考一下示例:

    var str = "ABC"; //根据推断为 字符串类型
    var l = 10L;//根据10L 推断long 类型
    var flag = true;//根据 true推断 boolean 类型
    var flag1 = 1;//这里会推断boolean类型。0表示false 非0表示true
    var list = new ArrayList<String>();  // 推断 ArrayList<String>
    var stream = list.stream();          // 推断 Stream<String>
    

    2、移除javah

    移除Native-Header Generation Tool (javah)
    JDK10 从JDK中移除了javah 工具。该工具已被JDK8 (JDK-7150368)中添加javac高级功能所取代。此功能提供了在编译java源代码时编写本机头文件的功能,从而无需使用单独的工具。

    3、IO流大家族添加charset参数

    其它

    JDK10中包含许多对JVM的优化:

    • 将JDK多存储库合并为单存储库
    • 并行Full GC 的G1
    • 垃圾回收接口
    • 应用数据共享
    • 线程局部管控
    • 基于实验JAVA 的JIT 编译器
    • 备用内存设备上分配堆内存

    JDK11新特性

    Java的改进提议被称为JEP(JDK Enhancement Proposal 特性增强提议),JDK11是Java改为6月一版之后的第一个LTS版本。

    1、HTTPClient转正

    JDK9中便引入httpclient模块,但它在jdk.incubator.httpclient包下,在java11被标记为正式,改为java.net.http模块。

    2、密码学方面的改进

    • 使用RFC 7748中描述的Curve25519和Curve448实现key agreement
    • 实现 RFC 7539的ChaCha20 and ChaCha20-Poly1305加密算法

    3、java命令运行java文件

    java Haha.java直接输出javac Haha.java &&java Haha的结果。

    4、废弃Nashorn JavaScript引擎

    Nashorn被废弃,GraalVM为推荐引擎。

    5、更灵活的String

    去除空白

    String text = "  u2000a  b  ";
    Assert.assertEquals("a  b",text.strip());
    Assert.assertEquals("u2000a  b",text.trim());
    Assert.assertEquals("a  b  ",text.stripLeading());
    Assert.assertEquals("  u2000a  b",text.stripTrailing());
    

    trim()和strip()的区别

    jshell> var aaa = fullSpace + "aaa" + fullSpace
    aaa ==> " aaa "
    
    jshell> aaa.strip()
    $14 ==> "aaa"
    
    jshell> aaa.trim()
    $15 ==> " aaa "
    

    lines()

    字符串实例方法,使用专门的 Spliterator 来懒惰地提供源字符串中的行

    jshell> "test
    hoge
    ".lines().map(String::toUpperCase).toArray()
    $11 ==> Object[2] { "TEST", "HOGE" }
    

    repeat(int)

    按照参数 int 提供的次数来重复字符串的运行次数

    jshell> "test".repeat(3)
    $7 ==> "testtesttest"
    

    isBlank()

    验证当前字符串是否为空,或者是否只包括空白字符(空白字符由 Character.isWhiteSpace(int) 验证)

    jshell> var halfSpace = "u0020"
    halfSpace ==> " "
    
    jshell> halfSpace.isBlank()
    $11 ==> true
    
    jshell> var fullSpace = "u3000"
    fullSpace ==> " "
    
    jshell> fullSpace.isBlank()
    $13 ==> true
    

    6、更方便的IO

    Path

    of(String, String...)
    此前我们需要使用 Paths.get()。现在,我们像其他类一样使用 of()。

    Files

    writeString(Path, CharSequence)
    我们可以使用该方法来保存一个 String 字符串。

    jshell> Files.writeString(Path.of("test.txt"), "Hello!!!")
    $3 ==> test.txt
    readString(Path)
    

    我们可以使用该方法来读取一个 String 字符串。

    jshell> Files.readString(Path.of("test.txt"))
    $4 ==> "Hello!!!"
    

    Reader

    nullReader()

    使用该方法,我们可以得到一个不执行任何操作的 Reader。

    Writer

    nullWriter()
    使用该方法,我们可以得到一个不执行任何操作的 Writer。

    InputStream

    nullInputStream()
    使用该方法,我们可以得到一个不执行任何操作的 InputStream。

    OutputStream

    nullOutputStream()
    使用该方法,我们可以得到一个不执行任何操作的 OutputStream。

    JDK12新特性

    1、switch语句

    import java.io.IOException;
    
    import static java.util.Calendar.*;
    
    class Haha {
    
    public static void main(String[] args) throws IOException, InterruptedException {
        var day = 2;
        switch (day) {
            case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
            case TUESDAY -> System.out.println(7);
            case THURSDAY, SATURDAY -> System.out.println(8);
            case WEDNESDAY -> System.out.println(9);
        }
    }
    }
    

    switch也可以用作语句

    System.out.println(switch (day) {
        case MONDAY, FRIDAY, SUNDAY -> 6;
        case TUESDAY -> 7;
        case THURSDAY, SATURDAY -> 8;
        case WEDNESDAY -> 9;
        default -> -1;
    });
    

    2、数字转字符串NumberFormat

    var cnf = NumberFormat.getCompactNumberInstance(Locale.CHINA, NumberFormat.Style.SHORT);
    System.out.println(cnf.format(1_0000));
    System.out.println(cnf.format(1_9200));
    System.out.println(cnf.format(1_000_000));
    System.out.println(cnf.format(1L << 30));
    System.out.println(cnf.format(1L << 40));
    System.out.println(cnf.format(1L << 50));
    System.out.println(NumberFormat.getCompactNumberInstance(Locale.CHINA, NumberFormat.Style.SHORT).format(12345));
    System.out.println(NumberFormat.getCompactNumberInstance(Locale.CHINA, NumberFormat.Style.LONG).format(12345));
    

    3、String的成员函数非常多

    transform

    @Test
    public void testStringTransform(){
        System.out.println("hello".transform(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                return s.hashCode();
            }
        }));
    }
    ​```
    indent
    ```java
    @Test
    public void testStringIndent(){
        System.out.println("hello".indent(3));
    }
    

    其它

    JDK12放弃了对jdk6及其以前版本的支持。

    参考资料

    https://www.cnblogs.com/peter1018/p/9234490.html
    https://segmentfault.com/a/1190000016527932
    https://www.oschina.net/news/98314/java-11-api-changes-so-far

  • 相关阅读:
    Java常用类库(二):Iterator迭代器和子范围视图
    Java常用类库(一) : Object 和日期类的简单使用
    MyBatis的逆向工程
    AdminLTE介绍和zTree的简单使用
    MyBatis分页组件--PageHelper
    SpringAop--系统日志简例
    Shiro
    Mysql(三):多表查询和存储程序
    MySql(二):常见的那些个约束
    正则表达式一些用法
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/10941334.html
Copyright © 2011-2022 走看看