本文主要讲述一下Java18的新特性
java -version
openjdk version "18" 2022-03-22
OpenJDK Runtime Environment (build 18+36-2087)
OpenJDK 64-Bit Server VM (build 18+36-2087, mixed mode, sharing)
从version信息可以看出是build 18+36
java18以前Charset.defaultCharset()是根据操作系统、user locale等来决定的,导致不同操作系统的默认charset是不一样,这次统一改为了UTF-8
java18要统一为UTF-8则需要
-Dfile.encoding=UTF-8
来设置如果还想沿用以前的判断方式则可以通过
-Dfile.encoding=COMPAT
来设置
提供了一个类似python的SimpleHTTPServer(
python -m SimpleHTTPServer [port]
)的开箱即用的HTTP文件服务器可以通过
jwebserver -p 9000
启动
jwebserver -p 9000
Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or "-b ::".
Serving /tmp and subdirectories on 127.0.0.1 port 9000
URL http://127.0.0.1:9000/
也可以在代码里定制并启动
jshell> var server = SimpleFileServer.createFileServer(new InetSocketAddress(8080),
...> Path.of("/some/path"), OutputLevel.VERBOSE);
jshell> server.start()
以前要在通过javadoc展示代码可以使用@code如下
<pre>{@code
lines of source code
}</pre>
但是它的缺点就是得用pre包装,导致该片段不能包含html标签,而且缩进不太灵活
而这次给javaDoc引入了@snippet标签,无需对html标签再进行转义
/**
* The following code shows how to use {@code Optional.isPresent}:
* {@snippet :
* if (v.isPresent()) {
* System.out.println("v: " + v.get());
* }
* }
*/
也可以直接引用源代码,避免javadoc的代码与实际代码脱节
/**
* The following code shows how to use {@code Optional.isPresent}:
* {@snippet file="ShowOptional.java" region="example"}
*/
通过Method Handles重新实现java.lang.reflect.Method, Constructor及Field来替代字节码生成的Method::invoke, Constructor::newInstance, Field::get, and Field::set的实现
方便支持Project Valhalla,为以后减少扩展成本
JDK16引入了JEP 338: Vector API (Incubator)提供了jdk.incubator.vector来用于矢量计算
JDK17进行改进并作为第二轮的incubatorJEP 414: Vector API (Second Incubator)
JDK18进行改进并作为第三轮的incubator
给解析网络地址提供了SPI,即java.net.spi包的InetAddressResolverProvider
方便给project loom做准备(目前InetAddress的API会阻塞在系统调用),也方便定制化及testing
JDK14的JEP 370: Foreign-Memory Access API (Incubator)引入了Foreign-Memory Access API作为incubator
JDK15的JEP 383: Foreign-Memory Access API (Second Incubator)Foreign-Memory Access API作为第二轮incubator
JDK16的JEP 393: Foreign-Memory Access API (Third Incubator)作为第三轮,它引入了Foreign Linker API
JDK17引入JEP 412: Foreign Function & Memory API (Incubator)作为第一轮incubator
JDK18则作为第二轮的incubator
instanceof的模式匹配在JDK14作为preview,在JDK15作为第二轮的preview,在JDK16转正
static String formatterPatternSwitch(Object o) {
return switch (o) {
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> o.toString();
};
}
JDK17引入JEP 406: Pattern Matching for switch (Preview)
JDK18则作为第二轮的preview
废弃finalize方法方便后续移除
上面列出的是大方面的特性,除此之外还有一些api的更新及废弃,主要见JDK 18 Release Notes,这里举几个例子。
-XX:+UseStringDeduplication
开启Elements.getFileObjectOf(Element)
来映射为JavaFileObject-XX:GCCardSizeInBytes
来设置card table大小jdk.net.usePlainDatagramSocketImpl
属性也一并移除完整列表见deprecated-list
javax.security.auth.Subject::doAs
为移除做准备-XX:G1RSetRegionEntries
及-XX:G1RSetSparseRegionEntries
Java18主要有如下几个特性
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。