Java17新增特性
前言
前面的文章,我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16 的特性进行了介绍,对应的文章如下
Java9新增特性
Java10新增特性
Java11新增特性
Java12新增特性
Java13新增特性
Java14新增特性
Java15新增特性
Java16新增特性
今天我们来一起看一下Java17这个版本的一些重要信息
版本介绍
Java 17 是 Java 平台的一个新版本,于 2021 年 9 月 14 日发布。这个版本是在 Java 11 之后的下一个主要版本,Java 17 是一个功能丰富的版本,引入了一些新的特性和改进,旨在提高安全性、性能和可维护性。
特性列表
-
默认的加密算法 :Java 17 引入了一组新的默认加密算法,包括 AES-GCM 和 SHA-256。这些算法比以前的默认算法更安全,提供了更好的加密性能。
-
ZGC 和 Sharding 增强 :Java 17 对 ZGC(Z Garbage Collector)进行了改进,增加了对非堆内存的支持,并改进了并行处理能力。此外,Java 17 还引入了堆内存分片的概念,可以将堆内存分成多个片段,以更好地适应不同类型的工作负载。
-
JDK 预编译 :Java 17 引入了 JDK (Java Development Kit) 预编译功能。这个功能可以在开发过程中提前预编译 Java 类,从而加快应用程序的启动速度。
-
外部化配置 :Java 17 引入了外部化配置的特性,允许将配置信息存储在外部文件中,而不是硬编码在应用程序中。这个特性可以让开发人员更容易地管理和维护应用程序的配置。
-
支持 Applet API :Java 17 再次支持 Applet API,这个 API 可以让开发人员在网页中嵌入 Java 应用程序。虽然这个 API 的使用场景已经减少了很多,但对于一些特定的应用场景来说,它仍然是有用的。
-
JDK 17 引入了新的 JIT(Just In Time)编译器 :Graal。这个编译器是由 Oracle 开发的,可以更有效地编译 Java 代码,提高运行时的性能。
-
Java 17 移除了 javah 工具(用于生成 C 语言头文件) : 这个工具已经不再被推荐使用,因为它的功能已经被其他工具所取代。
-
Java 17 引入了新的 API : 提供了 jdk.incubator.vector 来用于矢量计算。这个 API 可以更高效地处理向量化的数据操作。
-
Java 17 引入了 instanceof 的模式匹配转正 : 这个特性可以让开发者更方便地使用 instanceof 运算符进行模式匹配。
-
Java 17 移除了 RMI(Remote Method Invocation) :这个特性已经被废弃,被其他的远程调用技术所取代。
-
Java 17 引入了 sealed 类(密封类) : 这个特性可以让开发者定义不能被继承或者不能被实现的类,从而增加代码的安全性和可维护性。
-
Records(记录) :Java 17引入了记录,这是一种新的数据类语法,可以更方便地创建数据密集型对象。记录会自动生成getter、setter方法和equals()、hashCode()等方法,使得编写简单的POJO类变得更加容易。
-
Text Blocks(文本块):Java 17引入了文本块,这是一种新的字符串语法,可以更方便地处理多行字符串。使用三重引号(“”")可以定义一个文本块,并自动去除首尾的空白字符。
-
Switch Expressions(开关表达式) :Java 17引入了开关表达式,这是一种新的switch语句语法,可以使代码更加简洁和易读。开关表达式使用“switch (expression) { cases }”的语法,其中cases可以是常量、变量或表达式。
代码示例
- 如何使用Java 17中引入的局部类型推断特性:
import java.util.List;
import java.util.ArrayList;
public class Main {public static void main(String[] args) {List<String> names = new ArrayList<>();names.add("Alice");names.add("Bob");names.add("Charlie");for (var name : names) {System.out.println(name);}}
}
在上面的代码中,我们使用了局部类型推断特性来定义了一个类型为ArrayList的变量names。在for循环中,我们使用了“var”关键字来定义一个可以自动推断类型的迭代变量name。在循环体中,我们使用System.out.println()函数打印每个name的值。
- Java 17新特性的代码示例:
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
public class Main {public static void main(String[] args) {List<String> names = new ArrayList<>();names.add("Alice");names.add("Bob");names.add("Charlie");// 使用密封类和switch表达式switch (names) {case ArrayList al -> System.out.println("ArrayList: " + al);case LinkedList ll -> System.out.println("LinkedList: " + ll);default -> System.out.println("Other List implementation");}// 使用记录和文本块class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';}}Person alice = new Person("Alice", 30);Person bob = new Person("Bob", 25);Person charlie = new Person("Charlie", 35);List<Person> people = List.of(alice, bob, charlie);List<Person> filteredPeople = people.stream().filter(person -> person.age > 30).collect(Collectors.toList());// 使用模式匹配和instanceof的例子Object obj = "Hello World";if (obj instanceof String str) { // instanceof模式匹配,注意这里的语法变化!System.out.println("String value: " + str);} else {System.out.println("Not a String value");}}
}
- 密封类和记录的更详细示例代码:
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
// 定义一个密封类
sealed class Animal {String name;int age;public Animal(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Animal{" + "name='" + name + '\'' + ", age=" + age + '}';}
}
// 定义一个密封子类
final class Dog extends Animal {String breed;public Dog(String name, int age, String breed) {super(name, age);this.breed = breed;}@Overridepublic String toString() {return "Dog{" + "name='" + name + '\'' + ", age=" + age + ", breed='" + breed + '\'' + '}';}
}
// 定义一个密封子类
final class Cat extends Animal {String color;public Cat(String name, int age, String color) {super(name, age);this.color = color;}@Overridepublic String toString() {return "Cat{" + "name='" + name + '\'' + ", age=" + age + ", color='" + color + '\'' + '}';}
}
public class Main {public static void main(String[] args) {List<Animal> animals = new ArrayList<>();animals.add(new Dog("Spot", 5, "Golden Retriever"));animals.add(new Cat("Fluffy", 3, "White"));animals.add(new Animal("Elephant", 10)); // 非密封类实例化时不需要显式声明类名,直接使用Animal类即可。animals.add(new Dog("Rex", 8, "Poodle")); // 同上,可以继续实例化其他密封类的子类。animals.add(new Cat("Blackie", 5, "Black")); // 同上,可以继续实例化其他密封类的子类。animals.add(new Animal("Lion", 10)); // 非密封类实例化时不需要显式声明类名,直接使用Animal类即可。animals.add(new Dog("Spike", 12, "Bulldog")); // 同上,可以继续实例化其他密封类的子类。animals.add(new Animal("Tiger", 8)); // 非密封类实例化时不需要显式声明类名,直接使用Animal类即可。animals.add(new Animal("Penguin", 5)); // 非密封类实例化时不需要显式声明类名,直接使用Animal类即可。animals.add(new Dog("Lucy", 10, "Poodle")); // 同上,可以继续实例化其他密封类的子类。同时也可以看出,密封类不能被子类化,因此Dog和Cat都是Animal的最终子类。
密封类可以限制继承,只能被密封子类继承,不能被非密封类继承。
密封类的实例化必须显式声明类名,而非密封类则不需要。
记录是一种简化数据模型的方式,可以方便地定义和操作具有固定字段的数据结构。
总结
Java 17是Java的一个较新的版本,它有很多新特性和改进,可以提供更好的性能和更丰富的功能。然而,是否适合用于生产环境还需要根据具体情况进行评估。
在生产环境中,稳定性和可靠性是最重要的因素之一。Java 17可能还处于测试阶段,因此建议在生产环境中使用已经经过广泛验证的版本,如Java 8或Java 11。这些版本已经得到了社区的广泛支持和维护,具有更好的稳定性和可靠性。
另外,在选择Java版本时,还需要考虑与现有系统和应用的兼容性问题。如果现有的系统和应用都是基于较旧的Java版本开发的,那么升级到Java 17可能会导致兼容性问题。在这种情况下,建议在生产环境中继续使用与现有系统和应用兼容的Java版本。
总之,Java 17具有很多新特性和改进,但是否适合用于生产环境还需要根据具体情况进行评估。建议在生产环境中使用已经经过广泛验证的Java版本,以确保稳定性和可靠性。
拓展
AES-GCM
AES-GCM是高级加密标准(AES)的一种工作模式,全称是Galois/Counter Mode。它是一种有效的authenticated encryption算法,无需额外的认证算法,AES-GCM自带认证功能,可以同时完成加密和认证。
AES-GCM模式的主要特点有:
- 基于AES算法,使用AES的密码块进行加密操作。
- 使用Galois字段上的乘法进行认证,可以有效防止修改和重放攻击。
- 使用计数器(Counter)来避免在加密相同的明文时产生相同的密文,增强安全性。
- 认证标签长度较短(只有16字节),性能和带宽开销小。
AES-GCM模式是目前比较流行和高效的authenticated encryption算法,已被TLS、IPsec、MACsec等大量安全协议采用,在云计算、物联网和5G等领域有广泛的应用。
SHA-256
SHA-256是一种安全散列算法,它使用哈希函数来生成固定长度的摘要。SHA-256是SHA-2的一种,是专为防止密码破解而设计的。
SHA-256的特点包括:
- 安全性:SHA-256算法具有很高的安全性,可以抵御暴力破解和字典攻击等攻击方式。
- 唯一性:SHA-256算法生成的哈希值是唯一的,对于不同的输入数据,即使是微小的差异,也会产生完全不同的哈希值。
- 不可逆性:SHA-256算法是不可逆的,也就是说,无法从哈希值还原出原始数据。
- 长度固定:SHA-256算法生成的哈希值长度固定为256位,不会因为输入数据的长度而变化。
SHA-256被广泛应用于密码学、数据完整性验证和数字签名等领域。

相关文章:
Java17新增特性
前言 前面的文章,我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16 的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java16新增特…...
VR全景技术在城市园区发展中有哪些应用与帮助
引言: 在数字化时代的浪潮中,虚拟现实(VR)全景技术逐渐融入各个领域,也为城市园区展示带来了全新的可能性。 一.VR全景技术简介 虚拟现实全景技术是一种通过全景图像和视频模拟真实环境的技术。通过相关设…...
在 SQL 中,当复合主键成为外键时应该如何被其它表引用
文章目录 当研究一个问题慢慢深入时,一个看起来简单的问题也暗藏玄机。在 SQL 中,主键成为外键这是一个很平常的问题,乍一看没啥值得注意的。但如果这个主键是一种复合主键,而另一个表又引用这个键作为它的复合主键,问…...
Ps:通过显示大小了解图像的打印尺寸
在 Photoshop 中,如果想了解文档窗口中的图像打印出来之后的实质大小,只要知道两个数值即可。 第一个数值是图像分辨率(也称“文档分辨率”)的大小,可在Ps菜单:图像/图像大小 Image Size对话框中查询或设置…...
Linux - 驱动开发 - watchdog - SMP机制下多核确活
说明 理论上:不管IC是单核还是多核,只要watchdog有被循环feed,就不会触发超时重启,因此watchdog在SMP机制下的多核环境显得比较宽松,只要任意核存活(喂狗)就不会重启设备。 实际情况 有客户反…...
概念解析 | LoRA:低秩矩阵分解在神经网络微调中的魔力
注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:基于低秩矩阵分解的神经网络微调方法LoRA LoRA:低秩矩阵分解在神经网络微调中的魔力 Low-Rank Adaptation of Large Language Models LoRA由如下论文提出,详细信息请参见论文原…...
量子计算和量子通信技术:引领潜力无限的未来
近年来,随着量子计算和量子通信技术的迅速发展,它们在各个领域的广泛应用前景引起了人们的极大兴趣。本文将深入探讨量子计算和量子通信技术的普遍应用,以及它们预示的未来,同时提出业内人士需要注意的事项。 介绍:量子…...
nodejs+vue+python+PHP+微信小程序-安卓- 电影在线订票系统的设计与实现-计算机毕业设计推荐
目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...
LightDB23.4支持mysql aes_encrypt/aes_decrypt/hex/unhex函数
背景介绍 为了兼容mysql数据库的功能,在LightDB23.4版本上支持hex/unhex/aes_encrypt/aes_decrypt函数。 函数原型如下: hex(data bytea) returns textunhex(data varchar) returns byteaaes_encrypt(data bytea, key bytea) returns byteaaes_encryp…...
uniapp——项目day04
购物车页面——商品列表区域 渲染购物车商品列表的标题区域 1. 定义如下的 UI 结构: 2.美化样式 渲染商品列表区域的基本结构 1. 通过 mapState 辅助函数,将 Store 中的 cart 数组映射到当前页面中使用: import badgeMix from /mixins/tab…...
7-爬虫-中间件和下载中间件(加代理,加请求头,加cookie)、scrapy集成selenium、源码去重规则(布隆过滤器)、分布式爬虫
0 持久化(pipelines.py)使用步骤 1 爬虫中间件和下载中间件 1.1 爬虫中间件(一般不用) 1.2 下载中间件(代理,加请求头,加cookie) 1.2.1 加请求头(加到请求对象中) 1.2.2 加cookie 1.2.3 加代理 2 scrapy集成selenium 3 源码去重…...
创建自己的nas服务,从远端拉取所需文件
一、前言 创建一个nas文件存储,然后需要的时候随时从远端或者其他终端拉取所需文件是不是一件很帅气的工作。 二、准备工作 一台服务器(云的更好),没了。 首先安装docker和docker-compose 此处省略docker的安装(改天更新)&…...
智慧化城市内涝的预警,万宾科技内涝积水监测仪
随着城市化进程的加速,伴随的是城市内涝问题日益凸显。频繁的暴雨和积水给市民的生活带来了诸多不便,也给城市的基础设施带来了巨大压力。如何解决这一问题,成为智慧城市建设的重要课题和政府管理的工作主题,只要内涝问题得到缓解…...
7-18 调用一个函数
分数 2 作者 Yiping 单位 广东东软学院 现有如下程序,请将注释后带??的代码补充完整: import mathdef normalize(normal):x normal[0]y normal[1]z normal[2]s math.sqrt(x**2 y**2 z**2)x / sy / sz / sreturn (x, y, z)if __name__ __mai…...
VB.net TCP服务端监听端口接收客户端RFID网络读卡器上传的读卡数据
本 示例使用设备介绍:WIFI/TCP/UDP/HTTP协议RFID液显网络读卡器可二次开发语音播报POE-淘宝网 (taobao.com) Imports System.Threading Imports System.Net Imports System.Net.Sockets Public Class Form1Dim ListenSocket As SocketDim Dict As New Dictionary(Of…...
Springboot 集成 MongoDB
在SpringBoot项目中集成MongoDB后的一些基本操作。 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 本文介绍的内容是Springboot如何集成MongoDB,以及对MongoDB进行基本的增加、查询数据的操作。 提示:以下是本篇…...
AM@定积分的定义求某些类型的极限
文章目录 定积分定义求极限步骤例 定积分表示为极限 定积分定义求极限 容易从定积分的定义: ∫ a b f ( x ) d x \int_{a}^{b}f(x)\mathrm{d}x ∫abf(x)dx lim λ → 0 ∑ i 1 n f ( ξ i ) Δ x i \lim\limits_{\lambda\to{0}}\sum_{i1}^{n}f{(\xi_{i})}\Delta{x_i} λ→…...
Perl爬虫程序的框架
Perl爬虫程序的框架,这个框架可以用来爬取任何网页的内容。 perl #!/usr/bin/perl use strict; use warnings; use LWP::UserAgent; use HTML::TreeBuilder; # 创建LWP::UserAgent对象 my $ua LWP::UserAgent->new; # 设置代理信息 $ua->proxy(http, ); …...
15. 机器学习——聚类
机器学习面试题汇总与解析——聚类 本章讲解知识点 什么是聚类K-means 聚类算法均值偏移聚类算法DBSCAN 聚类算法高斯混合模型(GMM)的期望最大化(EM)聚类层次聚类算法本专栏适合于Python已经入门的学生或人士,有一定的编程基础。 本专栏适合于算法工程师、机器学习、图像…...
华为笔记本电脑原装win10/win11系统恢复安装教程方法
华为电脑matebook 14原装Win11系统带F10智能还原 安装恢复教程: 1.安装方法有两种,一种是用PE安装,一种是华为工厂包安装(安装完成自带F10智能还原) 若没有原装系统文件,请在这里获取:https:…...
万象熔炉 | Anything XL详细步骤:错误提示‘low VRAM’的5种应对策略
万象熔炉 | Anything XL详细步骤:错误提示‘low VRAM’的5种应对策略 1. 工具简介与显存挑战 万象熔炉 | Anything XL是一款基于Stable Diffusion XL Pipeline开发的本地图像生成工具,它最大的特点是支持直接加载safetensors单文件权重,无需…...
基于SiameseUniNLU的文本匹配与NLI实战:开源中文推理模型部署案例
基于SiameseUniNLU的文本匹配与NLI实战:开源中文推理模型部署案例 1. 项目介绍与核心价值 SiameseUniNLU是一个创新的中文自然语言理解模型,它采用统一的架构来处理多种NLP任务。这个模型最大的特点是用一套代码就能完成文本匹配、自然语言推理、实体识…...
丹青识画系统GitHub协作开发指南:从代码克隆到PR提交全流程
丹青识画系统GitHub协作开发指南:从代码克隆到PR提交全流程 你是不是也遇到过这种情况?团队里几个人一起改代码,最后合并的时候发现冲突一大堆,张三改了李四的代码,王五的提交又把功能搞坏了,光是解决这些…...
PyTorch-2.x-Universal-Dev-v1.0镜像详解:预装库、国内源、GPU验证全攻略
PyTorch-2.x-Universal-Dev-v1.0镜像详解:预装库、国内源、GPU验证全攻略 1. 镜像概述与核心优势 PyTorch-2.x-Universal-Dev-v1.0镜像是一个专为深度学习开发者打造的高效开发环境。它基于官方PyTorch底包构建,经过精心优化和配置,旨在解决…...
如何快速集成Socket.IO-Client-Swift与SwiftUI:构建现代化实时iOS应用的完整指南
如何快速集成Socket.IO-Client-Swift与SwiftUI:构建现代化实时iOS应用的完整指南 【免费下载链接】socket.io-client-swift 项目地址: https://gitcode.com/gh_mirrors/so/socket.io-client-swift Socket.IO-Client-Swift是一款功能强大的iOS/OS X实时通信库…...
SecGPT-14B+OpenClaw联调指南:解决模型响应超时问题
SecGPT-14BOpenClaw联调指南:解决模型响应超时问题 1. 问题背景与场景定位 上周在尝试用OpenClaw调用SecGPT-14B分析一份12万字的网络安全报告时,遭遇了令人头疼的响应超时问题。这个场景很典型——当我们需要处理长文本安全分析时,模型推理…...
技术视域下人的类本质异化复归:返璞归真与转识成智的同构性探索
摘要: 本文立足于技术哲学与认知科学的交叉地带,审视现代技术环境(如算法主导的信息流、虚拟社交、自动化决策)中人的类本质异化现象。文章深入剖析“返璞归真”作为克服异化、回归本真状态的路径内涵,并揭示其与“转识…...
一站式图像生成与编辑:Nano Banana 图像生成与编辑 API(包含多个示例和实用技巧)
在电商、时尚内容、网红营销或产品视觉设计领域,你是否曾面临以下挑战? 如何快速为同一肖像尝试多套服装?如何快速生成相同产品在不同场景/风格下的图像?如何将多个来源的材料合成一张“看起来真实”的图像? Ace Dat…...
告别魔法!Gemini 3.1 Pro 国内稳定API使用教程(开发者+普通用户双版)
一、开篇:Gemini 3.1 Pro 到底强在哪? Gemini 3.1 Pro 推理能力直接翻倍,彻底解决了AI行业“快则不精、精则太贵”的痛点。 不管你是开发者想对接API,还是普通用户想低成本体验超强推理模型,这篇文章都给你一套清晰、…...
Nextion Library技术解析:嵌入式HMI轻量通信框架
1. Nextion Library 深度技术解析:面向嵌入式工程师的轻量级HMI通信框架 1.1 库定位与工程价值 Nextion Library 是一个专为 Nextion 系列智能串口屏设计的轻量级 C 库,核心目标是 在资源受限的 MCU 平台上(如 Arduino Uno、STM32F0/F1、ES…...
