您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java 17的新特性都有什么?

时间:2023-07-12 11:19:04  来源:  作者:Java学研大本营

目前JAVA 17于2021年9月发布,增加和更新了许多新功能和增强功能。本文将详细介绍Java 17中一些最令人兴奋的新功能,并提供代码片段来说明对应的使用方法。

instanceof运算符的模式匹配

Java 17中一个重要的新功能是支持模式匹配。通过使用模式匹配,您可以使用更加简洁和表达力强的方式来对instanceof运算符进行操作。例如,您可以使用它来检查一个值是否为特定类型的实例,并在一个步骤中提取该值,从而使代码更加优化和易于理解。

以下是一个示例:

if (obj instanceof String s && s.length() > 5) {
  System.out.println(s.substring(0, 5) + "...");
}

在这个示例中,代码检查obj是否为String的实例,如果是,则将obj的值绑定到变量s中,如果字符串的长度大于5个字符,代码会打印字符串前5个字符并在后面加上省略号(...)与传统方法相比,这是一种更简洁、更易读的操作方式。

2 Text Blocks

Java 17中另一个令人兴奋的新功能是Text Blocks,这能让您更便捷地创建多行字符串。以下是一个示例:

String html = """
<html>
    <body>
        <p>Hello, world!</p>
    </body>
</html>
""";

正如您所看到的,Text Blocks功能让您可以创建多行字符串,而无需使用转义字符或连接符。这使创建包含多行文本的字符串变得更简单,比如HTML或JSON。

3 记录关键字

Java 17引入了Records功能,可以更简洁、易读地创建简单的数据类,这是该版本中的主要更新之一。Records是一种表示逻辑元组值的类,它提供了许多有用的功能,如自动生成构造函数和访问器方法,从而提高代码的可读性和可维护性。Records类的使用方式非常灵活,可以作为POJO(普通Java对象)的替代品,用于简化数据模型、数据传输对象、不可变类型等的创建。

以下是定义记录的示例:

record Book(String id, String name) {
  // 记录类自动为其字段定义访问器方法、
  // 以及构造函数和 toString() 方法。
  // 您还可以在记录类中定义其他方法和字段,
  // 如果需要,您还可以在record类中定义额外的方法和字段。
}

此代码定义了一个Book记录,它有两个字段:id和name。然后您可以创建此记录的实例,并像这样访问其字段:

Book book1=new Book(1,"Rich Dad Poor Dad");
int id=book1.id;
String name=book1.name;

正如您所看到的,Records功能为在Java代码中定义和使用数据类提供了一种简单和直观的方法。

4 封闭类

Java 17中最重要的新功能之一是添加了sealed类和接口。此功能允许开发人员指定哪些类可以实现或扩展给定的类或接口,在其代码中提供更多对继承的控制。

以下是使用sealed关键字定义只能由同一包中的类实现的类的示例:

public sealed interface Shape permits Circle, Rectangle {
    double calculateArea();
}

public final class Circle implements Shape {
    private final double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double calculateArea() {
        return Math.PI * radius * radius;
    }
}

public final class Rectangle implements Shape {
    private final double width;
    private final double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double calculateArea() {
        return width * height;
    }
}

public class MAIn {
    public static void main(String[] args) {
        Shape circle = new Circle(5.0);
        double circleArea = circle.calculateArea();
        System.out.println("Circle area: " + circleArea);

        Shape rectangle = new Rectangle(4.0, 6.0);
        double rectangleArea = rectangle.calculateArea();
        System.out.println("Rectangle area: " + rectangleArea);
    }
}

在这个示例中,Shape接口使用permits关键字被定义为密封的,指定了允许实现的类:CircleRectangle。每个实现类都提供了自己的calculateArea()方法实现。

Main类中,我们创建CircleRectangle的实例并调用它们各自的calculateArea()方法。由于只有CircleRectangle被允许实现Shape接口,我们可以确定它是唯一可能实现Shape接口的类。

5 Foreign Memory Access API

Java 17中另一个值得注意的功能是添加了外部内存访问API,使Java程序能够访问和操作Java堆之外的内存。这使得开发人员可以处理超过Java堆大小的大型数据集,并且还可以提高某些类型应用程序的性能。外部内存访问API使用java.lang.invoke.VarHandle类实现,该类提供了读写外部内存数据的方法。以下代码片段展示了如何使用VarHandle类从外部内存中读取整数值:

import java.lang.invoke.VarHandle;

public class ForeignMemoryAccessExample {
    public static void main(String[] args) {
        // 分配一块本机内存
        long address = allocate(1024);

        // 创建一个指向内存块的VarHandle
        VarHandle handle = VarHandle.ofAddress(address);

        // 使用VarHandle在内存块中读写值
        int value = (int) handle.get();
        handle.set(value + 1);
    }

    private static native long allocate(int size);
}

6 ZGC垃圾收集器

Java 17中最大的新功能之一是引入了ZGC垃圾收集器。该收集器旨在通过减少垃圾收集的时间来提高Java应用程序的性能。使用ZGC垃圾收集器,即使在使用大型堆的情况下,应用程序也可以实现小于10毫秒的暂停时间。以下是如何在代码中启用ZGC垃圾收集器的示例:

// 启用ZGC垃圾收集器
-XX:+UseZGC

7 Var关键字

Java 17还引入了多项类型系统和泛型处理方式的改进。其中一个最重要的更改是能够在声明本地变量时使用var关键字代替类型。这可以使您的代码更加简洁、易读,如下所示:

// 使用'var'关键字声明一个字符串列表
var names = List.of("Alice", "Bob", "Carol");
// 遍历列表并打印每个元素
for (var name : names) {
    System.out.println(name);
}

总的来说,Java 17是Java语言的一个重要更新,Java 17在性能、安全性和开发人员的生产力方面都有所提升,并引入了一些新的功能,使得Java编程变得更简便和直观。

推荐书单



Tags:Java 17   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
作者丨Sergei Dzeboev编译丨诺亚Java17给Java带来了一些变化,但也使许多开发人员重新考虑他们迁移到其他JVM语言的愿望。最明显的变化是在使Java代码现代化和添加新的语言结...【详细内容】
2023-08-09  Tags: Java 17  点击:(45)  评论:(0)  加入收藏
目前Java 17于2021年9月发布,增加和更新了许多新功能和增强功能。本文将详细介绍Java 17中一些最令人兴奋的新功能,并提供代码片段来说明对应的使用方法。 1 instanceof运算...【详细内容】
2023-07-12  Tags: Java 17  点击:(0)  评论:(0)  加入收藏
Java 17推出的新特性Sealed Classes经历了2个Preview版本(JDK 15中的JEP 360、JDK 16中的JEP 397),最终定稿于JDK 17中的JEP 409。Sealed Classes有两种主流翻译:密封类、封闭类...【详细内容】
2022-05-06  Tags: Java 17  点击:(291)  评论:(0)  加入收藏
▌简易百科推荐
本文翻译自国外论坛 medium,原文地址:https://medium.com/@AlexanderObregon/maven-best-practices-tips-and-tricks-for-java-developers-438eca03f72bMaven 简介Maven 是一...【详细内容】
2023-09-09  waynblog  微信公众号  Tags:Maven   点击:(3)  评论:(0)  加入收藏
在数据处理和分析过程中,数据去重是一个常见的需求。Java开发者可以使用MySQL数据库提供的丰富功能和优化技术来实现高效的数据去重。下面将介绍Java开发者如何利用MySQL数据...【详细内容】
2023-09-07  编程技术汇  今日头条  Tags:MySQL   点击:(8)  评论:(0)  加入收藏
优雅处理Java与MySQL的并发访问冲突是开发分布式系统时需要考虑的重要问题。在多个线程或多个应用同时对MySQL数据库进行读写操作时,可能会出现数据一致性问题和性能问题。为...【详细内容】
2023-09-07  编程技术汇  今日头条  Tags:Java   点击:(8)  评论:(0)  加入收藏
Java Reflection 是一种强大的机制,允许开发人员在运行时动态地操作和扩展对象。它提供了许多功能,如获取类的信息、创建对象、调用方法、获取和设置字段的值等。在某些场景下...【详细内容】
2023-09-06  编程技术汇  今日头条  Tags:Java Reflection   点击:(21)  评论:(0)  加入收藏
来源 | OSCHINA 社区作者 | 抽刀断水-鹰影原文链接:https://my.oschina.net/u/3276866/blog/10091251背景在 java 开发中我们经常会遇到这样的场景,代码需要在服务器上(测试或...【详细内容】
2023-09-06  OSC开源社区    Tags:Java   点击:(9)  评论:(0)  加入收藏
aviator本来是一个轻量级、高性能的基于JVM的表达式引擎。不过从5.0.0版本开始,aviator升级成为了aviatorScript,成为一个高性能、轻量级寄宿于 JVM (包括 Android 平台)之上的...【详细内容】
2023-09-05  码猿技术专栏  微信公众号  Tags:Java   点击:(29)  评论:(0)  加入收藏
我们知道对于 Java 应用可以通过 OpenTelemetry 提供的 Java agent 来实现自动埋点功能,在大多数场景下也完全足够了,但是有时候我们需要更加精细的控制,这时候我们就需要使用...【详细内容】
2023-09-05  k8s技术圈  微信公众号  Tags:Java   点击:(24)  评论:(0)  加入收藏
作者 | 蔡柱梁审校 | 重楼一、前言很多 Java 开发一般都是做中台较多,并发编程使用的不多。因此,对 ThreadLocal 不太熟悉,所以笔者这里想让大家了解它,知道它是用来干什么的。...【详细内容】
2023-09-04    51CTO  Tags:ThreadLocal   点击:(26)  评论:(0)  加入收藏
在Java编程中,条件判断是必不可少的一部分。为了实现简洁而高效的条件判断,Java提供了三元表达式(Ternary Expression)。下面将详细介绍Java三元表达式的语法、用法以及优势,并...【详细内容】
2023-09-03  编程技术汇  今日头条  Tags:Java   点击:(20)  评论:(0)  加入收藏
哈喽,大家好,我是了不起。Java多线程是Java编程语言的一个特性,它允许程序在同一时间执行多个任务。使用多线程可以充分利用计算机的多核处理器,提高程序的性能和响应速度。本...【详细内容】
2023-09-01  Java技术指北    Tags:Java多线程   点击:(29)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条