Java15的新特性
Java语言特性系列
- Java5的新特性
- Java6的新特性
- Java7的新特性
- Java8的新特性
- Java9的新特性
- Java10的新特性
- Java11的新特性
- Java12的新特性
- Java13的新特性
- Java14的新特性
- Java15的新特性
- Java16的新特性
序
本文主要讲述一下Java15的新特性
版本号
java -versionopenjdk version "15" 2020-09-15OpenJDK Runtime Environment (build 15+36-1562)OpenJDK 64-Bit Server VM (build 15+36-1562, mixed mode, sharing)
从version信息可以看出是build 15+36
特性列表
339:Edwards-Curve Digital Signature Algorithm (EdDSA)
新增rfc8032描述的Edwards-Curve Digital Signature Algorithm (EdDSA)实现 使用示例
// example: generate a key pair and signKeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519");KeyPair kp = kpg.generateKeyPair();// algorithm is pure Ed25519Signature sig = Signature.getInstance("Ed25519");sig.initSign(kp.getPrivate());sig.update(msg);byte[] s = sig.sign();// example: use KeyFactory to contruct a public keyKeyFactory kf = KeyFactory.getInstance("EdDSA");boolean xOdd = ...BigInteger y = ...NamedParameterSpec paramSpec = new NamedParameterSpec("Ed25519");EdECPublicKeySpec pubSpec = new EdECPublicKeySpec(paramSpec, new EdPoint(xOdd, y));PublicKey pubKey = kf.generatePublic(pubSpec);
360:Sealed Classes (Preview)
JDK15引入了sealed classes and interfaces.用于限定实现类,限定父类的使用,为后续的pattern matching的exhaustive analysis提供便利 示例
package com.example.geometry;public abstract sealed class Shape permits Circle, Rectangle, Square {...}public final class Circle extends Shape {...}public sealed class Rectangle extends Shape permits TransparentRectangle, FilledRectangle {...}public final class TransparentRectangle extends Rectangle {...}public final class FilledRectangle extends Rectangle {...}public non-sealed class Square extends Shape {...}
这里使用了3个关键字,一个是sealed,一个是permits,一个是non-sealed;permits的这些子类要么使用final,要么使用sealed,要么使用non-sealed修饰;针对record类型,也可以使用sealed,因为record类型暗示这final
package com.example.expression;public sealed interface Expr permits ConstantExpr, PlusExpr, TimesExpr, NegExpr {...}public record ConstantExpr(int i) implements Expr {...}public record PlusExpr(Expr a, Expr b) implements Expr {...}public record TimesExpr(Expr a, Expr b) implements Expr {...}public record NegExpr(Expr e) implements Expr {...}
371:Hidden Classes
JDK15引入了Hidden Classes,同时废弃了非标准的sun.misc.Unsafe::defineAnonymousClass,目标是为frameworks提供在运行时生成内部的class
372:Remove the Nashorn JavaScript Engine
JDK15移除了Nashorn JavaScript Engine及jjs tool,它们在JDK11的被标记为废弃;具体就是jdk.scripting.nashorn及jdk.scripting.nashorn.shell这两个模块被移除了
373:Reimplement the Legacy DatagramSocket API
该特性使用更简单及更现代的方式重新实现了java.net.DatagramSocket及java.net.MulticastSocket以方便更好的维护及debug,新的实现将会更容易支持virtual threads
374:Disable and Deprecate Biased Locking
该特性默认禁用了biased locking(
-XX:+UseBiasedLocking
),并且废弃了所有相关的命令行选型(BiasedLockingStartupDelay, BiasedLockingBulkRebiasThreshold, BiasedLockingBulkRevokeThreshold, BiasedLockingDecayTime, UseOptoBiasInlining, PrintBiasedLockingStatistics and PrintPreciseBiasedLockingStatistics
)
375:Pattern Matching for instanceof (Second Preview)
instanceof的Pattern Matching在JDK15进行Second Preview,示例如下:
public boolean equals(Object o) { return (o instanceof CaseInsensitiveString cis) && cis.s.equalsIgnoreCase(s); }
377:ZGC: A Scalable Low-Latency Garbage Collector
ZGC在JDK11被作为experimental feature引入,在JDK15变成Production,但是这并不是替换默认的GC,默认的GC仍然还是G1;之前需要通过
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
来启用ZGC,现在只需要-XX:+UseZGC
就可以 相关的参数有ZAllocationSpikeTolerance、ZCollectionInterval、ZFragmentationLimit、ZMarkStackSpaceLimit、ZProactive、ZUncommit、ZUncommitDelay ZGC-specific JFR events(ZAllocationStall、ZPageAllocation、ZPageCacheFlush、ZRelocationSet、ZRelocationSetGroup、ZUncommit
)也从experimental变为product
378:Text Blocks
Text Blocks在JDK13被作为preview feature引入,在JDK14作为Second Preview,在JDK15变为最终版
379:Shenandoah: A Low-Pause-Time Garbage Collector
Shenandoah在JDK12被作为experimental引入,在JDK15变为Production;之前需要通过
-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
来启用,现在只需要-XX:+UseShenandoahGC
即可启用
381:Remove the Solaris and SPARC Ports
Solaris and SPARC Ports在JDK14被标记为废弃,在JDK15版本正式移除
383:Foreign-Memory Access API (Second Incubator)
Foreign-Memory Access API在JDK14被作为incubating API引入,在JDK15处于Second Incubator
384:Records (Second Preview)
Records在JDK14被作为preview引入,在JDK15处于Second Preview
385:Deprecate RMI Activation for Removal
JDK15废弃了RMI Activation,后续将被移除
细项解读
上面列出的是大方面的特性,除此之外还有一些api的更新及废弃,主要见JDK 15 Release Notes,这里举几个例子。
添加项
- Support for Unicode 13.0 (JDK-8239383)
升级了Unicode,支持Unicode 13.0
- Added isEmpty Default Method to CharSequence (JDK-8215401)
给CharSequence新增了isEmpty方法 java.base/java/lang/CharSequence.java
/** * Returns {@code true} if this character sequence is empty. * * @implSpec * The default implementation returns the result of calling {@code length() == 0}. * * @return {@code true} if {@link #length()} is {@code 0}, otherwise * {@code false} * * @since 15 */ default boolean isEmpty() { return this.length() == 0; }
- Added Support for SO_INCOMING_NAPI_ID Support (JDK-8243099)
jdk.net.ExtendedSocketOptions新增了SO_INCOMING_NAPI_ID选型
- Specialized Implementations of TreeMap Methods (JDK-8176894)
JDK15对TreeMap提供了putIfAbsent, computeIfAbsent, computeIfPresent, compute, merge方法提供了overriding实现
- New Option Added to jcmd for Writing a gzipped Heap Dump (JDK-8237354)
jcmd的GC.heap_dump命令现在支持gz选型,以dump出gzip压缩版的heap;compression level从1(
fastest
)到9(slowest, but best compression
),默认为1
- New System Properties to Configure the TLS Signature Schemes (JDK-8242141)
新增了
jdk.tls.client.SignatureSchemes
及jdk.tls.server.SignatureSchemes
用于配置TLS Signature Schemes
- Support for certificate_authorities Extension (JDK-8206925)
支持certificate_authorities的扩展
移除项
- Obsolete -XX:UseAdaptiveGCBoundary (JDK-8228991)
淘汰了-XX:UseAdaptiveGCBoundary
废弃项
- Deprecated -XX:ForceNUMA Option (JDK-8243628)
废弃了ForceNUMA选项
- Disable Native SunEC Implementation by Default (JDK-8237219)
默认禁用了Native SunEC Implementation
已知问题
- java.net.HttpClient Does Not Override Protocols Specified in SSLContext Default Parameters (JDK-8239594)
HttpClient现在没有覆盖在SSLContext Default Parameters中指定的Protocols
其他事项
- DatagramPacket.getPort() Returns 0 When the Port Is Not Set (JDK-8237890)
当DatagramPacket没有设置port的时候,其getPort方法返回0
- Improved Ergonomics for G1 Heap Region Size (JDK-8241670)
优化了默认G1 Heap Region Size的计算
小结
Java15主要有如下几个特性
- 339:Edwards-Curve Digital Signature Algorithm (EdDSA)
- 360:Sealed Classes (Preview)
- 371:Hidden Classes
- 372:Remove the Nashorn JavaScript Engine
- 373:Reimplement the Legacy DatagramSocket API
- 374:Disable and Deprecate Biased Locking
- 375:Pattern Matching for instanceof (Second Preview)
- 377:ZGC: A Scalable Low-Latency Garbage Collector
- 378:Text Blocks
- 379:Shenandoah: A Low-Pause-Time Garbage Collector
- 381:Remove the Solaris and SPARC Ports
- 383:Foreign-Memory Access API (Second Incubator)
- 384:Records (Second Preview)
- 385:Deprecate RMI Activation for Removal
doc
- JDK 15 Features
- JDK 15 Release Notes
- Oracle JDK 15 Release Notes
- Java SE deprecated-list
- The Arrival of Java 15
- Java 15 and IntelliJ IDEA
- Android 混淆那些事儿
- H5 直播避坑指南
- H5 和移动端 WebView 缓存机制解析与实战
- 根据IE版本加载不同CSS样式的方法小结,解决低版本IE兼容问题
- Linux下用dd命令测试硬盘的读写速度
- 教你 Debug 的正确姿势——记一次 CoreMotion 的 Crash
- Linux系统yum命令安装软件时保留(下载)rpm包
- Go语言读写数据库
- 《Android 创建线程源码与OOM分析》
- 微信 Android 视频编码爬过的那些坑
- 少年,这有套《街霸2》AI速成心法,想传授于你……
- 你知道android的MessageQueue.IdleHandler吗?
- 《Android基础:Fragment,看这篇就够了》
- Android 7.0中ContentProvider实现原理
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- centos7 PHP环境搭建 GD库 等插件安装方法
- CentOS服务器环境下MySQL主从同步配置方法
- awk命令
- linux下C语言实现写日志功能
- centOS7下Spark安装配置教程详解
- linux tail 查看日志文件方法
- Linux下Python脚本自启动和定时启动的详细步骤
- linux后台执行命令&和nohup的具体使用方法
- Linux修改hostname与免密码登录的方法
- Linux启动与停止spring boot工程的脚本示例
- 在Linux上如何检查用户所属组详解
- Linux中移除(删除)符号链接的命令
- Linux定时备份数据库到指定邮箱的方法
- 详解nohup /dev/null 2>&1 含义的使用
- centOS7安装jdk1.8的方法