本文总结了JDK 9至18版本中的一些主要特性,包括模块化系统、HTTP客户端API、局部变量类型推断、Records等。这些新特性和改进为Java开发者提供了更丰富、更便捷的编程体验,也为Java应用程序的性能和可维护性提供了保障。
JDK 9:
- 模块化系统(Java Platform Module System):允许将代码划分为离散且相互依赖的模块,提高了安全性、可维护性和可扩展性。
- JShell交互式编程环境:提供了一种在命令行界面快速测试代码的方式。
- 改进的Javadoc:增加了对模块和私有方法的支持。
- 多版本兼容Jar包:允许在同一个Jar包中使用不同版本的类。
JDK 10:
- 局部变量类型推断:允许在局部变量声明时省略类型,并由编译器自动推断类型。
- 基于时间的版本发布模式:修改了JDK版本发布周期,并引入了长期支持版本。
- 应用类数据共享(Application Class-Data Sharing):通过在多个JVM实例之间共享类元数据来提高启动速度,并减少内存占用。
- G1 GC的并行全阶段垃圾回收:提高了GC效率。
- 线程本地握手:允许线程在执行异步操作前进行协作。
JDK 11:
- HTTP客户端API:增加了标准化的HTTP客户端API,使得进行HTTP通信更加方便和灵活。
- Epsilon垃圾回收器:一种轻量级的垃圾回收器,主要用于性能测试和内存压力测试。
- 建议删除Java EE和CORBA模块:简化了JDK结构。
- ZGC垃圾回收器(实验性):一种可扩展的低延迟垃圾回收器,适用于大型堆内存。
JDK 12:
- Switch表达式增强:允许在Switch语句中使用Lambda表达式和返回值,并支持多个匹配条件。
- JVM Constants API:提供了API来读取类文件中的常量池信息。
- Shenandoah垃圾回收器(实验性):一种可以处理TB级别的内存的垃圾回收器,适用于内存密集型应用。
JDK 13:
- Text Blocks(预览功能):提供了一种更简洁易读的方式来定义多行字符串。
- 改进ZGC:提高了ZGC的速度和可伸缩性。
- Dynamic CDS Archives(实验性):允许在运行时动态生成共享归档文件。
- Switch表达式增强(扩展支持):扩展了Switch表达式的功能,包括支持多个分支执行和在同一个代码块中定义变量。
JDK 14:
- Records(预览功能):提供了一种更简洁易读的方式来定义轻量级不可变数据类。
- Pattern Matching for instanceof(预览功能):允许在Switch语句中使用instanceof,同时匹配并强制转换类型。
- 增强Switch表达式:允许在一个分支中包含多个值,并增加了新的关键字case L ->。
- 兼容Windows ARM64平台:增加了对Windows ARM64平台的支持。
JDK 15:
- 隐式的类文件属性:为类文件添加了Signature和Deprecated属性,以提高静态检查和代码迁移的效率。
- 改进G1垃圾回收器:提高了G1 GC的性能和稳定性。
- 新增ZGC垃圾回收器特性:包括动态调整线程数、卸载类和压缩对象等
JDK 16:
- Records升级为正式功能:使Records成为Java的一种基本数据类型,提供了更好的代码组织和类型安全。
- Vector API(预览功能):提供了一组向量化算术和逻辑运算操作,可以在现代CPU上提高性能。
- 新增Alpine Linux支持:使Java应用程序可以在轻量级的Alpine Linux发行版上运行。
- macOS AArch64平台支持:允许在苹果M1芯片等支持AArch64架构的macOS设备上运行Java应用程序。
JDK 17:
- 增强Switch表达式:支持匹配多个模式、嵌套Switch语句和模式变量。
- 改进ZGC和Shenandoah垃圾回收器:提高了垃圾回收器的性能和可伸缩性。
- 新增Sealed Class(预览功能):限制类的继承和实现,提高了代码的安全性和可维护性。
- Vector API升级为正式功能:提供了更多的算术和比较运算操作,支持更多的数据类型。
JDK 18:
- JEP 391,支持Unix域套接字(Unix Domain Socket):允许Java应用程序使用Unix域套接字进行通信。
- JEP 412,Vector API改进,添加新的向量算术操作:支持更多的数据类型、更灵活的操作和可扩展性。
- JEP 414,Vector API改进,支持更多数据类型的向量化操作:增加了整数运算、位运算和浮点数运算等操作。
- 改进ZGC和Shenandoah垃圾回收器:提高了垃圾回收器的性能和稳定性。
下面是示例展示:
JDK9
模块化系统(Java Platform Module System)
module com.example.mymodule {
requires org.apache.commons.lang3;
exports com.example.mypackage;
}
JShell交互式编程环境
jshell> int a = 10
a ==> 10
jshell> int b = 20
b ==> 20
jshell> a + b
$3 ==> 30
接口私有方法
public interface MyInterface {
default void myMethod() {
// some code here
}
private void myPrivateMethod() {
// some code here
}
}
JDK10
局部变量类型推断
var myList = new ArrayList<String>();
myList.add("Java");
myList.add("Kotlin");
基于时间的版本发布模式
JDK 10发布后6个月,JDK 11发布。
应用类数据共享(Application Class-Data Sharing)
java -Xshare:dump
java -Xshare:on
G1 GC的并行全阶段垃圾回收
-Xmx8g
-XX:+UseG1GC
线程本地握手
ThreadLocalRandom.current().nextInt();
JDK 11
HTTP客户端API
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.example.com"))
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
Epsilon垃圾回收器
java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC MyApp
ZGC垃圾回收器(实验性)
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC MyApp
JDK 12
Switch表达式增强
String result = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> "The day is good.";
case TUESDAY -> "The day is so-so.";
case THURSDAY, SATURDAY -> "The day is nice.";
case WEDNESDAY -> "The day is bad.";
default -> "Invalid day.";
};
System.out.println(result);
JVM Constants API
public class MyConstants {
public static final String FOO = "foo";
public static final String BAR = "bar";
}
Shenandoah垃圾回收器(实验性)
java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC MyApp
JDK 13
Text Blocks(预览功能)
String html = """
<html>
<body>
<p>Hello, world!</p>
</body>
</html>
""";
Dynamic CDS Archives(实验性)
java -Xshare:off -XX:DumpLoadedClassList=classes.lst MyApp
java -Xshare:dump -XX:SharedClassListFile=classes.lst \
-XX:SharedArchiveFile=myapp.jsa
java -Xshare:on -XX:SharedArchiveFile=myapp.jsa MyApp
Switch表达式增强(扩展支持)
String result = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> "The day is good.";
case TUESDAY -> "The day is so-so.";
case THURSDAY, SATURDAY -> "The day is nice.";
case WEDNESDAY -> "The day is bad.";
default -> {
if (day.toString().startsWith("W")) {
yield "The day starts with 'W'.";
} else {
yield "Invalid day.";
}
}
};
System.out.println(result);
JDK 14
Records(预览功能)
public record Person(String name, int age) {}
Person person = new Person("Alice", 25);
Pattern Matching for instanceof(预览功能)
if (obj instanceof String s && s.length() > 5) {
System.out.println(s.toUpperCase());
}
兼容Windows ARM64平台
if (System.getProperty("os.arch").equals("aarch64")) {
// some code here
}
增强Switch表达式
String result = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> "The day is good.";
case TUESDAY -> "The day is so-so.";
case THURSDAY, SATURDAY -> "The day is nice.";
case WEDNESDAY -> "The day is bad.";
default -> "Invalid day.";
} yield result;
System.out.println(result);
JDK 15
隐式的类文件属性
public class MyClass {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
改进G1垃圾回收器
java -XX:+UseG1GC -XX:G1HeapRegionSize=n MyApp
新增ZGC垃圾回收器特性
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms1g -Xmx8g MyApp
禁用基于RSA的TLS证书
jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768
JDK 16
Records升级为正式功能
public record Person(String name, int age) {}
Person person = new Person("Alice", 25);
Vector API(预览功能)
public static float dotProduct(float[] a, float[] b) {
var vectorA = FloatVector.fromArray(FloatVector.SPECIES_256, a, 0);
var vectorB = FloatVector.fromArray(FloatVector.SPECIES_256, b, 0);
return vectorA.dot(vectorB, FloatVector.SPECIES_256.reduceLanes());
}
新增Alpine Linux支持
FROM openjdk:16-alpineCOPY MyApp.jar /app/CMD ["java", "-jar", "/app/MyApp.jar"]
macOS AArch64平台支持
brew install --cask adoptopenjdk/openjdk/adoptopenjdk16
export PATH="/usr/local/opt/openjdk@16/bin:$PATH"
java -version
JDK 17
增强Switch表达式
String result = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> "The day is good.";
case TUESDAY -> "The day is so-so.";
case THURSDAY, SATURDAY -> "The day is nice.";
case WEDNESDAY -> "The day is bad.";
default -> throw new IllegalArgumentException("Invalid day.");
};
System.out.println(result);
改进ZGC和Shenandoah垃圾回收器
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xms1g -Xmx8g MyApp
java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC MyApp
新增Sealed Class(预览功能)
public sealed class Shape permits Circle, Rectangle, Triangle {}
final class Circle extends Shape {}
final class Rectangle extends Shape {}
final class Triangle extends Shape {}
Vector API升级为正式功能
public static float dotProduct(float[] a, float[] b) {
var vectorA = FloatVector.fromArray(FloatVector.SPECIES_256, a, 0);
var vectorB = FloatVector.fromArray(FloatVector.SPECIES_256, b, 0);
return vectorA.dot(vectorB, FloatVector.SPECIES_256.reduceLanes());
}
JDK 18
JEP 391,支持Unix域套接字(Unix Domain Socket)
Path unixDomainSocketPath = Paths.get("/var/run/mysocket.sock");
try (AsynchronousServerSocketChannel serverChannel =
AsynchronousServerSocketChannel.open(StandardProtocolFamily.UNIX)) {
serverChannel.bind(new UnixDomainSocketAddress(unixDomainSocketPath));
} catch (IOException e) {
// handle exception
}
JEP 412,Vector API改进,添加新的向量算术操作
public static void multiplyAdd(float[] a, float[] b, float[] c, float alpha) {
var vectorA = FloatVector.fromArray(FloatVector.SPECIES_256, a, 0);
欢迎关注公众号:程序员的思考与落地
公众号提供大量实践案例,Java入门者不容错过哦,可以交流!!