Java语言特性系列
本文主要讲述一下Java15的新特性html
java -version openjdk version "15" 2020-09-15 OpenJDK Runtime Environment (build 15+36-1562) OpenJDK 64-Bit Server VM (build 15+36-1562, mixed mode, sharing)
从version信息能够看出是build 15+36
新增 rfc8032描述的Edwards-Curve Digital Signature Algorithm (EdDSA)实现
使用示例
// example: generate a key pair and sign KeyPairGenerator kpg = KeyPairGenerator.getInstance("Ed25519"); KeyPair kp = kpg.generateKeyPair(); // algorithm is pure Ed25519 Signature sig = Signature.getInstance("Ed25519"); sig.initSign(kp.getPrivate()); sig.update(msg); byte[] s = sig.sign(); // example: use KeyFactory to contruct a public key KeyFactory 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);
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 {...}
JDK15引入了Hidden Classes,同时废弃了非标准的sun.misc.Unsafe::defineAnonymousClass,目标是为frameworks提供在运行时生成内部的class
JDK15移除了Nashorn JavaScript Engine及jjs tool,它们在JDK11的被标记为废弃;具体就是jdk.scripting.nashorn及jdk.scripting.nashorn.shell这两个模块被移除了
该特性使用更简单及更现代的方式从新实现了java.net.DatagramSocket及java.net.MulticastSocket以方便更好的维护及debug,新的实现将会更容易支持virtual threads
该特性默认禁用了biased locking(-XX:+UseBiasedLocking
),而且废弃了全部相关的命令行选型(BiasedLockingStartupDelay, BiasedLockingBulkRebiasThreshold, BiasedLockingBulkRevokeThreshold, BiasedLockingDecayTime, UseOptoBiasInlining, PrintBiasedLockingStatistics and PrintPreciseBiasedLockingStatistics
)
instanceof的Pattern Matching在JDK15进行Second Preview,示例以下:
public boolean equals(Object o) { return (o instanceof CaseInsensitiveString cis) && cis.s.equalsIgnoreCase(s); }
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
Text Blocks在JDK13被做为preview feature引入,在JDK14做为Second Preview,在JDK15变为最终版
Shenandoah在JDK12被做为experimental引入,在JDK15变为Production;以前须要经过-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC
来启用,如今只须要-XX:+UseShenandoahGC
便可启用
Solaris and SPARC Ports在JDK14被标记为废弃,在JDK15版本正式移除
Foreign-Memory Access API在JDK14被做为incubating API引入,在JDK15处于Second Incubator
Records在JDK14被做为preview引入,在JDK15处于Second Preview
JDK15废弃了RMI Activation,后续将被移除
上面列出的是大方面的特性,除此以外还有一些api的更新及废弃,主要见JDK 15 Release Notes,这里举几个例子。java
升级了Unicode,支持Unicode 13.0
给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; }
jdk.net.ExtendedSocketOptions新增了SO_INCOMING_NAPI_ID选型
JDK15对TreeMap提供了putIfAbsent, computeIfAbsent, computeIfPresent, compute, merge方法提供了overriding实现
jcmd的GC.heap_dump命令如今支持gz选型,以dump出gzip压缩版的heap;compression level从1(fastest
)到9(slowest, but best compression
),默认为1
新增了jdk.tls.client.SignatureSchemes
及jdk.tls.server.SignatureSchemes
用于配置TLS Signature Schemes
支持certificate_authorities的扩展
淘汰了-XX:UseAdaptiveGCBoundary
废弃了ForceNUMA选项
默认禁用了Native SunEC Implementation
HttpClient如今没有覆盖在SSLContext Default Parameters中指定的Protocols
当DatagramPacket没有设置port的时候,其getPort方法返回0
优化了默认G1 Heap Region Size的计算
Java15主要有以下几个特性git