Java 15语言新特性
更新时间 2021-07-08 14:50:19    浏览 0   

TIP

本文主要是介绍 Java 15语言新特性 。

本文主要讲述一下Java15的新特性

# 版本号

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

# 特性列表

# 339:Edwards-Curve Digital Signature Algorithm (EdDSA) (opens new window)

新增rfc8032 (opens new window)描述的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);

# 360:Sealed Classes (Preview) (opens new window)

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 (opens new window)

JDK15引入了Hidden Classes,同时废弃了非标准的sun.misc.Unsafe::defineAnonymousClass,目标是为frameworks提供在运行时生成内部的class

# 372:Remove the Nashorn JavaScript Engine (opens new window)

JDK15移除了Nashorn JavaScript Engine及jjs tool,它们在JDK11的被标记为废弃;具体就是jdk.scripting.nashorn及jdk.scripting.nashorn.shell这两个模块被移除了

# 373:Reimplement the Legacy DatagramSocket API (opens new window)

该特性使用更简单及更现代的方式重新实现了java.net.DatagramSocket及java.net.MulticastSocket以方便更好的维护及debug,新的实现将会更容易支持virtual threads

# 374:Disable and Deprecate Biased Locking (opens new window)

该特性默认禁用了biased locking(-XX:+UseBiasedLocking),并且废弃了所有相关的命令行选型(BiasedLockingStartupDelay, BiasedLockingBulkRebiasThreshold, BiasedLockingBulkRevokeThreshold, BiasedLockingDecayTime, UseOptoBiasInlining, PrintBiasedLockingStatistics and PrintPreciseBiasedLockingStatistics)

# 375:Pattern Matching for instanceof (Second Preview) (opens new window)

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 (opens new window)

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 (opens new window)

Text Blocks在JDK13被作为preview feature引入,在JDK14作为Second Preview,在JDK15变为最终版

# 379:Shenandoah: A Low-Pause-Time Garbage Collector (opens new window)

Shenandoah在JDK12被作为experimental引入,在JDK15变为Production;之前需要通过-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC来启用,现在只需要-XX:+UseShenandoahGC即可启用

# 381:Remove the Solaris and SPARC Ports (opens new window)

Solaris and SPARC Ports在JDK14被标记为废弃,在JDK15版本正式移除

# 383:Foreign-Memory Access API (Second Incubator) (opens new window)

Foreign-Memory Access API在JDK14被作为incubating API引入,在JDK15处于Second Incubator

# 384:Records (Second Preview) (opens new window)

Records在JDK14被作为preview引入,在JDK15处于Second Preview

# 385:Deprecate RMI Activation for Removal (opens new window)

JDK15废弃了RMI Activation,后续将被移除

# 细项解读

上面列出的是大方面的特性,除此之外还有一些api的更新及废弃,主要见JDK 15 Release Notes (opens new window),这里举几个例子。

# 添加项

升级了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.SignatureSchemesjdk.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的计算

# 参考文章

  • https://segmentfault.com/a/1190000024485709
更新时间: 2021-07-08 14:50:19
  0
手机看
公众号
讨论
左栏
全屏
上一篇
下一篇
扫一扫 手机阅读
可分享给好友和朋友圈