我们还在用JDK 8,最新版本都到JDK18啦,来看下它们的主要特性!

147 阅读5分钟

本文总结了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入门者不容错过哦,可以交流!!