java14_Java14的新特性

Java语言特性系列

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

版本号java -version

openjdk version "14" 2020-03-17

OpenJDK Runtime Environment (build 14+36-1461)

OpenJDK 64-Bit Server VM (build 14+36-1461, mixed mode, sharing)从version信息可以看出是build 14+36

特性列表JDK14引入了preview版本的针对instanceof的模式匹配,其用法示例如下public boolean isBadRequestError(Exception ex) {

return (ex instanceof HttpClientErrorException rce) &&

HttpStatus.BAD_REQUEST == rce.getStatusCode();

}无需在自己进行类型强转JDK14引入了jdk.incubator.jpackage.jmod,它基于JavaFX javapackager tool构建,目的在于创建一个简单的打包工具,可以用于构建exe、pkg、dmg、deb、rpm格式的安装文件;非模块化的app的构建示例如下jpackage --name myapp --input lib --main-jar main.jar实现了NUMA-aware的内存分配,以提升G1在大型机器上的性能JDK11引入了JFR,使用的时候先dump到磁盘上然后再分析;而在JDK14则支持stream方式来进行持续性的监控,示例如下public class AgentMain implements Runnable {

public static void premain(String agentArgs, Instrumentation inst) {

try {

Logger.getLogger("AgentMain").log(

Level.INFO, "Attaching JFR Monitor");

new Thread(new AgentMain()).start();

} catch (Throwable t) {

Logger.getLogger("AgentMain").log(

Level.SEVERE,"Unable to attach JFR Monitor", t);

}

}

@Override

public void run() {

var sender = new JfrStreamEventSender();

try (var rs = new RecordingStream()) {

rs.enable("jdk.CPULoad")

.withPeriod(Duration.ofSeconds(1));

rs.enable("jdk.JavaMonitorEnter")

.withThreshold(Duration.ofMillis(10));

rs.onEvent("jdk.CPULoad", sender);

rs.onEvent("jdk.JavaMonitorEnter", sender);

rs.start();

}

}

}该特性新增了java.base/jdk/internal/misc/ExtendedMapMode.java以支持MappedByteBuffer访问non-volatile memory (NVM)该特性可以更好地提示哪个地方出现的空指针,需要通过-XX:+ShowCodeDetailsInExceptionMessages开启,示例如下public class NullPointerExample {

public record City(String name){

}

public record Location(City city) {

}

public record User(String name, Location location) {

}

public static void main(String[] args){

User user = new User("hello", new Location(null));

System.out.println(user.location().city().name());

}

}输出如下Exception in thread "main" java.lang.NullPointerException: Cannot invoke "com.example.NullPointerExample$City.name()" because the return value of "com.example.NullPointerExample$Location.city()" is null

at com.example.NullPointerExample.main(NullPointerExample.java:25)JDK14引入了preview版本的record类型,示例如下public record Point(int x, int y) {

public Point {

System.out.println(String.format("(%d,%d)", x, y));

}

public Point(int value) {

this(value, value);

}

public static Point of(int value) {

return new Point(value, value);

}

}javap反编译如下javac --enable-preview -source 14 Point.java

javap -verbose Point.class

Compiled from "Point.java"

public final class com.example.domain.Point extends java.lang.Record {

public com.example.domain.Point(int, int);

public static com.example.domain.Point of(int);

public java.lang.String toString();

public final int hashCode();

public final boolean equals(java.lang.Object);

public int x();

public int y();

}可以看见Point继承了java.lang.Record,而且通过invokedynamic提供了final的hashCode及equalsJDK12引入的switch在JDK14变为正式版本,正式版主要是用->来替代以前的:+break;另外就是提供了yield来在block中返回值,示例如下public void testSwitchWithArrowBlockAndYield() {

int n = 3;

String quantityString = switch (n) {

case 1 -> "one";

case 2 -> "two";

default -> {

System.out.println("default");

yield "many";

}

};

System.out.println(quantityString);

}废弃了 Solaris/SPARC, Solaris/x64, and Linux/SPARC ports,以在未来的版本中移除移除了CMS垃圾收集器,如果在JDK14中使用-XX:+UseConcMarkSweepGC的话,会出现warning,但是不会exit而是以默认的垃圾收集器运行,如下OpenJDK 64-Bit Server VM warning: Ignoring option UseConcMarkSweepGC; support was removed in 14.0之前的ZGC只能在linux上使用,现在mac上也能使用ZGC了,示例如下-XX:+UnlockExperimentalVMOptions -XX:+UseZGC之前的ZGC只能在linux上使用,现在windows(不能低于1803版本)上也能使用ZGC了,示例如下-XX:+UnlockExperimentalVMOptions -XX:+UseZGC废弃了parallel young generation GC与SerialOld GC的组合(-XX:+UseParallelGC与-XX:-UseParallelOldGC配合开启),现在使用-XX:+UseParallelGC -XX:-UseParallelOldGC或者-XX:-UseParallelOldGC都会出现告警如下OpenJDK 64-Bit Server VM warning: Option UseParallelOldGC was deprecated in version 14.0 and will likely be removed in a future release.单独使用-XX:+UseParallelGC则开启parallel young and old generation GC algorithms移除了Pack200 APIJDK13引入的text blocks进行第二轮preview,JDK14的版本主要增加了两个escape sequences,分别是\与\s escape sequence,示例如下@Test

public void testTextBlockWithTwoNewEscapeSequences() {

String inOneLine = """

Lorem ipsum dolor sit amet, consectetur adipiscing \

elit, sed do eiusmod tempor incididunt ut labore \

et dolore magna aliqua.\

""";

System.out.println(inOneLine);

String singleSpace = """

red \s

green\s

blue \s

""";

System.out.println(singleSpace);

}提供了incubator版本的API用于操纵堆外内存,使用示例如下@Test

public void testForeignMemoryAccessAPI() {

SequenceLayout intArrayLayout

= MemoryLayout.ofSequence(25,

MemoryLayout.ofValueBits(32,

ByteOrder.nativeOrder()));

VarHandle intElemHandle

= intArrayLayout.varHandle(int.class,

MemoryLayout.PathElement.sequenceElement());

try (MemorySegment segment = MemorySegment.allocateNative(intArrayLayout)) {

MemoryAddress base = segment.baseAddress();

for (int i = 0; i < intArrayLayout.elementCount().getAsLong(); i++) {

intElemHandle.set(base, (long) i, i);

}

}

}

细项解读

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

添加项New Method to SAX ContentHandler for Handling XML Declaration (JDK-8230814)给SAX ContentHandler新增了方法,如下default void declaration(String version, String encoding, String standalone)

throws SAXException

{

//no op

}

移除项Removal of sun.nio.cs.map System Property (JDK-8229960)移除了sun.nio.cs.map属性Removed Deprecated java.security.acl APIs (JDK-8191138)移除了java.security.aclRemoval of the Default keytool -keyalg Value (JDK-8214024)移除了默认的keytool -keyalg

废弃项Thread Suspend/Resume Are Deprecated for Removal (JDK-8231602)废弃了Thread的如下方法Thread.suspend()

Thread.resume()

ThreadGroup.suspend()

ThreadGroup.resume()

ThreadGroup.allowThreadSuspension(boolean)

已知问题Text Visibility Issues in macOS Dark Mode (JDK-8228555)已知在macOS上的Dark Mode有Text Visibility Issues

其他事项Thread.countStackFrames Changed to Unconditionally Throw UnsupportedOperationException (JDK-8205132)Thread.countStackFrames开启转为无条件地抛出UnsupportedOperationException

小结

Java14主要有如下几个特性

doc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 15相比Java 14新增了一些新特性,以下是其中几个: 1. 隐藏类 Java 15中,引入了隐藏类(Hidden Classes)的概念,可以在不暴露类名的情况下创建类并实例化对象。这可以提高安全性并减少命名冲突。下面是一个例子: ```java class MyRunnable implements Runnable { public void run() { System.out.println("Hello, World!"); } } public class Main { public static void main(String[] args) throws Exception { var myRunnableClass = Class.forName("MyRunnable"); var myRunnableConstructor = myRunnableClass.getDeclaredConstructor(); myRunnableConstructor.setAccessible(true); var myRunnable = (Runnable) myRunnableConstructor.newInstance(); myRunnable.run(); } } ``` 2. Records的增强 Java 15中,对Records进行了增强,支持使用“with”方法来创建新的对象,以及支持使用“equals”和“hashCode”方法进行比较。下面是一个例子: ```java public record Person(String name, int age) { public Person { if (age < 0) { throw new IllegalArgumentException("Age cannot be negative"); } } public Person withName(String name) { return new Person(name, age); } } Person p1 = new Person("John", 30); Person p2 = p1.withName("Jane"); System.out.println(p1.equals(p2)); // 输出 "false" ``` 3. Text Blocks的增强 Java 15中,对Text Blocks进行了增强,支持使用“\”来转义换行符、支持使用嵌入式表达式以及支持使用“stripIndent”方法去除首尾空白符。下面是一个例子: ```java String html = """ <html> <head> <title>%s</title> </head> <body> <h1>%s</h1> <p>%s</p> </body> </html> """.formatted("Hello, World!", "Hello, World!", "Lorem ipsum"); System.out.println(html.stripIndent()); ``` 以上就是Java 15的一些新特性

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值