Java 18 新特性 (EOL)
warning
生命周期结束时间(EOL): 2023/03/16
官方发布介绍页面:https://openjdk.org/projects/jdk/18/
1. 简单的 Web 服务器
JDK 18 引入了一个简单的 Web 服务器,适用于测试、开发和调试。
import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
public class SimpleWebServer {
public static void main(String[] args) throws IOException {
HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0);
server.createContext("/test", exchange -> {
String response = "Hello, World!";
exchange.sendResponseHeaders(200, response.getBytes().length);
try (OutputStream os = exchange.getResponseBody()) {
os.write(response.getBytes());
}
});
server.setExecutor(null);
server.start();
}
}
2. UTF-8 作为默认字符集
JDK 18 将 UTF-8 设置为默认字符集。
import java.nio.charset.Charset;
public class DefaultCharset {
public static void main(String[] args) {
System.out.println(Charset.defaultCharset()); // UTF-8
}
}
3. Javadoc中新增@snippet标签
JDK 18 支持在 Java API 文档中使用代码片段。
/**
* This is a sample method.
* {@snippet :
* System.out.println("Hello, World!");
* }
*/
public void sampleMethod() {
System.out.println("Hello, World!");
}
4. Vector API (第三次孵化器)
引入了 Vector API,允许在 Java 中进行矢量计算。
import jdk.incubator.vector.*;
public class VectorExample {
public static void main(String[] args) {
VectorSpecies<Integer> SPECIES = IntVector.SPECIES_256;
int[] a = {1, 2, 3, 4, 5, 6, 7, 8};
IntVector va = IntVector.fromArray(SPECIES, a, 0);
IntVector vb = va.add(1);
vb.intoArray(a, 0);
for (int i : a) {
System.out.println(i); // 2, 3, 4, 5, 6, 7, 8, 9
}
}
}
5. Finalization 被标记为即将移除
JDK 18 标记了对象终结机制 (finalization) 为即将移除。
7. Internet 地址解析 SPI
引入了 Internet-Address Resolution SPI,允许自定义主机名解析。
import java.net.InetAddress;
import java.net.spi.InetAddressResolver;
import java.net.spi.InetAddressResolverProvider;
import java.util.List;
public class CustomInetAddressResolverProvider extends InetAddressResolverProvider {
@Override
public InetAddressResolver get(InetAddressResolverProvider.Configuration configuration) {
return new CustomInetAddressResolver();
}
private static class CustomInetAddressResolver implements InetAddressResolver {
@Override
public List<InetAddress> lookupByName(String host, LookupPolicy lookupPolicy) {
// Custom host name resolution logic
return List.of();
}
@Override
public String lookupByAddress(byte[] addr) {
// Custom address resolution logic
return null;
}
}
}
8. 外部函数和内存API(第二次孵化)
引入了外部函数和内存 API,允许 Java 程序调用本地代码和访问外部内存。
import jdk.incubator.foreign.*;
public class ForeignMemoryAccess {
public static void main(String[] args) {
try (MemorySegment segment = MemorySegment.allocateNative(100)) {
MemoryAccess.setIntAtOffset(segment, 0, 42);
int value = MemoryAccess.getIntAtOffset(segment, 0);
System.out.println(value); // 42
}
}
}
9. Applet API 被标记为即将移除
Applet API 被标记为即将移除。