首页 > 编程语言 >Java学习之JDK9新特性

Java学习之JDK9新特性

时间:2022-11-01 10:32:23浏览次数:80  
标签:set Java 特性 try JDK9 anonymous 泛型 new


写在前面:
现在(2019-01-12)绝大多数的公司或者个人都在使用JDK8,这一点毋庸置疑,但是不排除那些需要自我反省一下的落后者还在使用JDK5~7。毕竟JDK12都出来了。参考​​​JDK12​​​,还有​​JDK13​​​。
本文是参考网络诸多资料的学习笔记。

Diamond Operator<>钻石操作符改进

在JDK7之前每次声明泛型变量的时必须左右两边都同时声明泛型:
​​​List<String> list = new ArrayList<String>();​​ 右边的泛型声明看起来有些多余?

JDK7对这一点进行改进,不必两边都声明泛型,这种只适用<>标记的操作,称之为钻石操作符Diamond Operator;IDEA的language level里面也可见一斑:

Java学习之JDK9新特性_java


因此可以简写为:​​List<String> list = new ArrayList<>();​​ 但是不允许在匿名类上使用:

Java学习之JDK9新特性_java_02


报错:’<>’ cannot be used with anonymous classes。

JDK9对此加以改进:

Allow diamond with anonymous classes if the argument type of the inferred type is denotable. Because the inferred type using diamond with an anonymous class constructor could be outside of the set of types supported by the signature attribute, using diamond with anonymous classes was disallowed in Java SE 7. As noted in the JSR 334 proposed final draft, it would be possible to ease this restriction if the inferred type was denotable.

try-with-resources

在早起的JDK中,最早接触流处理时,无论是JDBC,还是文件读取等;一定会很蛋疼,因为需要记住关闭流;否则会有资源泄露问题,严重的情况下会有其他CPU占用等。所以,我们需要写很多重复的代码:打开文件流,关闭文件流,判断流的关闭与否等等。

在JDK7中,这一问题得到改善。使用try…with…resource,可以少写不少代码:

try(ResourceA some = new ResourceA();
ResourceB other = new ResourceB()) {
some.doSome();
other.doOther();
} catch(Exception ex) {
ex.printStackTrace();
}

其中,ResourceA和ResourceB都是实现AutoCloseable(实际上所有实现java.io.Closeable接口的类或者接口都行)的资源类。

但是,不能在 try-with-resources 语句中直接使用该变量,而必须像上面的代码片段一样声明新变量。

Java学习之JDK9新特性_ide_03


通过IDEA快速切换language level(上面有示意图),切换到JDK9,发现这个写法在JDK9里面是支持的。

针对集合的工厂方法优化

JDK9之前,有限元素的不可变集合的初始化是这样的:

Set<String> set = new HashSet<>();
set.add("a");
set.add("b");
set.add("c");
set = Collections.unmodifiableSet(set);

如果切换到JDK9:

Java学习之JDK9新特性_JDK9_04


依照IDEA的智能提醒,一行代码搞定:

​Set<String> set = Set.of("a", "b", "c");​​ 注意:因为这种方式初始化的集合是不可变的,创建后,继续添加元素会导致 “UnsupportedOperationException” 。

Java学习之JDK9新特性_ide_05


问题:unmodifiable与immutable有什么区别?

参考:​​JEP-269​

模块化

JVM

新的编译工具:jaotc
示例:

  • compile:​​jaotc --output libHelloWorld.so HelloWorld.class​
  • run: ​​java -XX:AOTLibrary=./libHelloWorl.so HelloWorld​

ahead-of-time compilation,​​jep 295​​ 通过提供类库风格的机制(library-like mechanism)以降低启动开销

G1作为默认GC,​​jep 248​​​ 在通用场景下,通常认为gc延迟的重要性高于吞吐量
G1,健壮且经过充分测试的收集器:

  • 直接设定延迟目标,能够达到延迟SLAs
  • 最坏场景的延迟表现优于CMS(设计原理导致碎片化问题)

参考

​JEP-213​​​​Java9新特性系列(总结)​

​​​JDK 9 New Features​


标签:set,Java,特性,try,JDK9,anonymous,泛型,new
From: https://blog.51cto.com/u_15851118/5811982

相关文章

  • 面试之基础算法题:求一个数字在给定的已排序数组中出现的起始、终止索引号(Java版)
    题目给定一个升序的整数数组,查找某一个值在数组中出现的索引号,例如,输入数组​​[2,3,3,4,4,5]​​​;查找的数是3,则返回​​[1,2]​​。时间复杂度要求为O(logN)。思路......
  • java操作http请求的三种方式
    java操作http请求的三种方式一、HttpClient步骤:1.获取一个Http客户端CloseableHttpClienthttpClient=HttpClients.createDefault();2.创建一个请求HttpGethttpGet......
  • Java 基于 SpringCloud 数据中台 ETL 工具,可以进行多种常见数据库之间的数据或结构迁
    基于SpringCloud数据中台ETL工具,可以进行多种常见数据库之间的数据或结构迁移提供源端数据库向目的端数据库的批量迁移同步功能,支持数据的全量和增量方式同步。包括:......
  • Java多线程(7):JUC(上)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 前面把线程相关的生命周期、关键字、线程池(ThreadPool)、ThreadLocal、CAS、锁和AQS都讲完了,现在就剩下怎么来用多线程了......
  • JavaScript中Array.from()方法的用法
    1.介绍作用:将一个伪数组对象或者可迭代的任意对象转换为一个真正的数组语法:Array.from(arrayLike[,mapFunction[,thisArg]])arrayLike:必传参数,指定需要转换为数......
  • Java-什么是多态,多态的具体体现有那些?
    多态:方法或者对象有多种形态,是OOP的第三大特征,是建立在封装和继承之上的多态的具体体现:方法多态重载体现多态重写体现多态对象多态对象的编译类型和运行类型可......
  • Java-equals和“==”的区别
    “==”是比较运算符,可以用于判断基本数据类型是否相等,当用于判断引用类型的时候,比较的对象的内存地址是否相同equals是Object类当中的方法,不可以用于判断基本数据是否相......
  • 学习java的第二天
    java语法学习注释,标识符,关键字写代码时一定写注释这是一个良好的习惯单行注释:“//”这是一个当行注释多行注释:"/*+回车"这是一个多行注释文档注释:"/**+......
  • java 中的final关键字
    final关键字是最终的意思,可以修饰类、变量、方法,在使用时具有如下特点:1.被final修饰的类,不能被继承权限修饰符finalclass类名{}2.被final修饰的方法,不能被重写(覆......
  • SAP Java Connector 错误 - JCO_ERROR_COMMUNICATION
    我运行SAPJavaConnector自带的SimpleCall例子程序时,遇到如下错误消息:Exceptioninthread"main"com.sap.conn.jco.JCoException:(102)JCO_ERROR_COMMUNICATION......