解锁JDK 12的奇妙之旅:新特性详解

news2024/11/26 15:38:16

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

解锁JDK 12的奇妙之旅:新特性详解

    • 前言
    • switch表达式拓展
    • NumberFormat对复杂数字的格式化
    • 字符串支持transform、indent操作
    • 新增方法Files.mismatch(Path, Path)
    • Teeing Collector
    • 支持unicode 11
    • Shenandoah GC,新增的GC算法
    • G1收集器的优化

前言

在Java的发展历程中,每个新版本都带来了令人兴奋的功能和性能改进。JDK 12作为Java发展的最新一环,不仅引入了一系列新特性,还为开发者提供了更多工具来提高代码的可读性和性能。让我们一起踏上JDK 12的奇妙之旅,发现编程的新可能性。

switch表达式拓展

JDK 12引入了对Switch表达式的增强,这是一个预览功能,它允许switch表达式不仅作为语句使用,还可以返回值。这意味着你可以将switch直接用在表达式中,并且根据不同的情况返回不同的值。

在此之前的Java版本中,switch语句只能作为语句执行,不能直接返回值或赋值给变量。但是在JDK 12中,switch表达式可以像任何其他表达式一样返回一个值,这让代码更简洁,减少了编写额外的boilerplate代码的需要。

这里是一个简单的例子来说明这个新特性:

int month = 4;
String monthString = switch (month) {
    case 1 -> "January";
    case 2 -> "February";
    case 3 -> "March";
    case 4 -> "April";
    // ... other cases ...
    default -> "Unknown";
};
System.out.println(monthString);  // This will print "April"

在这个例子中,switch表达式根据month的值返回一个字符串,并且这个字符串被赋值给monthString变量。这种方式使得代码更加直观和简洁。

请注意,由于这是一个预览功能,你可能需要在编译和运行时开启特定的预览特性开关来使用它。此外,随着Java的发展,这些特性可能会有所调整。

NumberFormat对复杂数字的格式化

在JDK 12中,对NumberFormat类的改进,这是Java提供的一个用于格式化数字到不同类型的文本表示(如本地货币、百分比等)的类。虽然JDK 12没有特别针对“复杂数字”的新功能,但Java一直在更新和改进其NumberFormat类以提供更好的数字格式化支持。

其中一个重要的改进是对于不同地区的数字格式的支持,这包括货币、百分比、小数的格式化,以及如何处理舍入和分组分隔符等问题。这些改进旨在使NumberFormat更加灵活,能够满足更广泛的国际化需求。

例如,你可以使用NumberFormat来格式化数字为特定地区的货币表示:

double amount = 1234567.89;
NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "US"));
String formattedAmount = formatter.format(amount);
System.out.println(formattedAmount);  // $1,234,567.89

如果你是在寻找JDK 12中特定的关于“复杂数字”格式化的新特性,我建议查阅最新的JDK文档或发布说明,因为Java在每个版本中都可能引入新的特性或改进现有的特性。如果有特定的功能或改进引入,那么它会在相关的JDK发布说明中被详细描述。

字符串支持transform、indent操作

在JDK 12中,引入了对字符串的一些新操作,包括transformindent方法,这些都是String类的新功能。

  1. transform 方法:

    • transform方法是一个非常有用的新功能,它允许你对字符串进行任意的转换操作。
    • 这个方法接受一个Function接口的实例作为参数,该参数定义了如何转换字符串。
    • 返回值是转换后的结果,这个结果不限于字符串类型,可以是任何类型。

    示例代码:

    String original = "Java";
    String result = original.transform(input -> input + " 12");
    System.out.println(result);  // 输出 "Java 12"
    
  2. indent 方法:

    • indent方法允许你增加或减少字符串的缩进级别。
    • 它接受一个整数参数,表示要添加(正数)或删除(负数)多少空格的缩进。
    • 如果传递的值是正数,它会在每行前面添加相应数量的空格;如果是负数,则尽可能删除每行前面的空格,但不会删除超过现有空格数的空格。

    示例代码:

    String text = "Hello\nWorld";
    String indentedText = text.indent(2);
    System.out.println(indentedText);
    // 输出:
    //   Hello
    //   World
    

这些方法提高了在处理字符串时的灵活性和表达能力,使得一些原本需要较复杂代码才能实现的操作变得简单直观。例如,transform方法可以结合任何函数式接口来灵活处理字符串转换,而indent方法则提供了一个快速调整字符串缩进的简便方式,非常适用于格式化输出。

新增方法Files.mismatch(Path, Path)

在JDK 12中,Files类新增了一个非常有用的方法:mismatch(Path, Path)。这个方法用于比较两个文件的内容,找出它们第一个不相同的字节位置。

以下是Files.mismatch(Path, Path)方法的一些关键点:

  1. 功能: 它比较两个文件的字节内容,如果完全相同,则返回-1;如果不同,返回第一个不匹配的字节的索引(基于零)。

  2. 用途: 这个方法非常有用于检查两个文件是否完全一致,比如在文件复制验证、备份验证等场景下。

  3. 效率: 相比于手动打开两个文件并逐字节比较,mismatch方法提供了一个更高效、更简洁的方式来进行文件内容的比较。

  4. 异常处理: 如果在访问任一文件时发生IOException,这个方法会抛出该异常。

示例用法:

Path path1 = Paths.get("file1.txt");
Path path2 = Paths.get("file2.txt");

long mismatchIndex = Files.mismatch(path1, path2);

if (mismatchIndex == -1L) {
    System.out.println("文件内容完全相同");
} else {
    System.out.println("文件内容不同,首个不同的字节位置在:" + mismatchIndex);
}

这个方法提供了一种简单直接的方式来比较两个文件,无需编写复杂的循环或调用多个API,使得文件比较操作更加便捷和直观。

Teeing Collector

在JDK 12中,Collectors 类引入了一个非常有趣的新方法:teeing(). 这个方法是一个Collector,它允许同时进行两种不同的收集操作,并将它们的结果合并为一个。这种功能在需要对同一数据流进行多种处理时特别有用。

以下是teeing()方法的一些关键点:

  1. 参数:

    • 它接收三个参数:两个Collector和一个BiFunction
    • 前两个参数是你希望对输入元素同时执行的两个收集器。
    • 第三个参数是一个函数,用于处理前两个收集器的结果,并将它们合并为单一的最终结果。
  2. 用途:

    • teeing()可以用于同时进行两种不同的聚合操作,例如,你可以同时计算同一数据集的平均值和总和。
    • 它可以使得在一次操作中完成原本需要多次遍历数据才能完成的任务。
  3. 示例:
    假设你有一组数字,你想要同时计算它们的总和和平均值。你可以使用teeing()来同时进行这两种操作:

List<Integer> numbers = List.of(10, 20, 30, 40);

DoubleSummaryStatistics result = numbers.stream()
    .collect(Collectors.teeing(
        Collectors.summingDouble(i -> i),   // 第一个收集器
        Collectors.averagingDouble(i -> i), // 第二个收集器
        (sum, avg) -> new DoubleSummaryStatistics(1, sum, sum, avg) // 合并函数
    ));

System.out.println("总和: " + result.getSum());
System.out.println("平均值: " + result.getAverage());

在这个例子中,teeing()同时应用了summingDouble()averagingDouble()两个收集器,并将它们的结果合并为一个DoubleSummaryStatistics对象。

teeing()是JDK 12的一个强大的新特性,它提供了一种灵活的方法来同时执行多种操作,并将它们的结果合并为一个。这对于需要对数据进行复杂处理的应用程序非常有用。

支持unicode 11

在JDK 12中,Java增加了对Unicode 11.0的支持。每个新版本的Unicode都会引入更多的字符、表情符号以及对各种语言的改进支持。这些更新通常包括新的字符、脚本以及一系列的符号,包括但不限于各种表情符号和其他符号。

对Unicode 11.0的支持意味着Java能够识别、处理和呈现新增的字符集和属性。这对于需要处理多语言文本、特殊符号或者需要最新表情符号支持的应用程序来说是非常重要的。程序员现在可以在他们的Java应用程序中使用Unicode 11.0中引入的所有新字符和符号。

Unicode 11.0引入了:

  • 新增的字符:包括来自扩展的语言或符号集的新字符。
  • 新增的表情符号:为文本对话提供更丰富的情感表达方式。
  • 脚本和相关属性的改进:确保更准确和全面的语言支持。

更新Java以支持最新的Unicode版本是Java持续支持全球化和国际化的一部分,确保开发者能够为全世界的用户创建应用程序,并处理各种语言和符号系统。

Shenandoah GC,新增的GC算法

在JDK 12中,Java引入了一个新的垃圾收集器(GC):Shenandoah。Shenandoah GC是一种低停顿时间的垃圾收集器,旨在针对具有大堆内存和多核处理器的应用程序提供更好的性能。它是为了减少GC操作期间的暂停时间而设计,即使是在处理大量内存时也能保持应用程序的响应性。

以下是Shenandoah GC的一些关键特性:

  1. 低停顿时间:

    • Shenandoah GC的主要目标是减少GC期间的停顿时间,即使是在进行全堆回收时。
    • 它通过一种称为并发压缩回收的技术来实现这一点,允许大部分垃圾收集工作与应用程序线程并行进行。
  2. 并发回收:

    • Shenandoah并发地执行大多数垃圾收集任务,包括标记、回收和压缩阶段。这意味着应用程序可以在垃圾收集过程中继续运行,从而减少停顿时间。
  3. 适用场景:

    • 它特别适用于需要大堆内存和高吞吐量的应用程序,同时要求低延迟,比如实时系统和大数据处理。
  4. 启用Shenandoah GC:

    • 要在Java应用程序中使用Shenandoah GC,需要在启动JVM时通过命令行参数明确指定。例如:

      java -XX:+UseShenandoahGC MyApplication
      
  5. 实验性质:

    • 在JDK 12中,Shenandoah仍然是一个实验性功能,意味着它可能不适合所有生产环境,且未来版本中的表现和特性可能会有所变化。

Shenandoah GC的引入提供了Java开发者一个新的工具,用以管理应用程序的性能和响应时间,特别是在需要处理大量内存时。然而,正如所有垃圾收集器一样,选择是否使用Shenandoah GC应基于具体应用的需求和通过充分的测试来做出。

G1收集器的优化

在JDK 12中,G1垃圾收集器(Garbage-First Collector)得到了进一步的优化。G1收集器是一个为了提高大堆内存系统的垃圾回收效率而设计的收集器,它旨在提供一个可预测的停顿时间模型,即通过限制一些垃圾回收活动的时间来避免长时间的停顿。以下是一些G1收集器在JDK 12及以后版本中得到的优化:

  1. 改进的暂停时间预测:

    • G1收集器的一个关键目标是提供可预测的停顿时间。新版本中对暂停时间的预测算法进行了改进,使得停顿时间更加可控和一致,尤其是在大堆内存的情况下。
  2. 并行全堆回收:

    • JDK 12中对G1的优化包括改进了全堆回收的并行性。通过更有效地利用可用的CPU资源,减少了全堆回收的时间,这对于大型应用和服务来说尤其重要。
  3. 改善垃圾回收周期:

    • 对G1垃圾回收周期的调整,使其更加智能和高效。包括更好地决定何时启动回收,以及如何选择回收的区域(Region),以减少应用程序的停顿时间。
  4. String去重复:

    • JDK 12继续支持并优化了G1的字符串去重功能,这有助于减少内存占用,特别是对于那些创建了大量相同字符串的应用程序。
  5. 卡表条目处理:

    • 对卡表(Card Table)的处理也得到了优化。卡表是G1用来记录跨代引用的数据结构。通过优化其处理方式,可以减少垃圾收集的开销。
  6. 改进的日志和诊断信息:

    • G1收集器增加了更多的日志和诊断信息,帮助开发者更好地理解和调整垃圾收集行为。

选择和调优垃圾收集器是一个复杂的任务,需要考虑许多因素,如应用程序的特点、JVM设置、硬件资源等。G1收集器的这些优化使得它在处理大内存和要求低延迟的应用中表现更好,但最佳的收集器选择仍然取决于具体的应用场景和需求。在应用到生产环境前,建议进行充分的测试和性能评估。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1332386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AG16KDDF256 User Manual

AGM AG16KDDF256 是由 AGM FPGA AG16K 与 DDR-SDRAM 叠封集成的芯片&#xff0c;具有 AG16K FPGA的可编程功能&#xff0c;提供更多可编程 IO&#xff0c;同时内部连接大容量 DDR-SDRAM。  FPGA 外部管脚 FBGA256 封装&#xff0c;管脚说明请见下表 Table-1&#xff1a; Tab…

微服务实战系列之Dubbo(上)

前言 随着一年一度冬至的到来&#xff0c;2023的步伐也将远去。而博主的系列文章&#xff0c;也将从今天起&#xff0c;越来越聚焦如何构建微服务“内核”上。前序系列文章几乎囊括了微服务的方方面面&#xff0c;无论使用什么框架、组件或工具&#xff0c;皆可拿来用之。 那么…

探秘JDK 13的黑科技:新特性一览

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘JDK 13的黑科技&#xff1a;新特性一览 前言switch表达式扩展Switch表达式的基本概念&#xff1a;使用Switch表达式的优势&#xff1a;示例代码&#xff1a;注意事项和最佳实践&#xff1a; Text …

【面向对象】对比JavaScript、Go、Ada、Python、C++、Java、PHP的访问限制。

在不同编程语言中&#xff0c;控制成员&#xff08;变量、方法、类等&#xff09;可见性的机制不尽相同。以下是对比JavaScript、Go、Ada、Python、C、Java、PHP所使用的访问限制关键字和约定&#xff1a; 一、JavaScript ### JavaScript访问限制 早期的JavaScript并没有类似…

Selenium4+Python3 - Iframe、Select控件、交互式弹出框、执行JS、Cookie操作

一、iframe操作 iframe识别&#xff1a; 语法&#xff1a; driver.switch_to.frame(‘方式’) 1、常见处理方法三种 index&#xff1a;下标name&#xff1a;id或name属性的值webelement&#xff1a;元素 2、通过下标进入 进入第一个iframe&#xff1a; driver.switch_to.…

【什么是反射机制?为什么反射慢?】

✅ 什么是反射机制&#xff1f;为什么反射慢&#xff1f; ✅典型解析✅拓展知识仓✅反射常见的应用场景✅反射和Class的关系 ✅典型解析 反射机制指的是程序在运行时能够获取自身的信息。在iava中&#xff0c;只要给定类的名字&#xff0c;那么就可以通过反射机制来获得类的所有…

C++笔试训练day_2

文章目录 选择题7. 编程题1.2. 选择题 &#xff08;6&#xff09;因为p2被const修饰所以p2不可以被改变&#xff0c;但是p2的指向可以被改变 &#xff08;7&#xff09;因为指针p3被const修饰&#xff0c;所以p3的指向不能被改变&#xff0c;但是*p3可以被改变 int main() {in…

spring boot集成mybatis和springsecurity实现权限控制功能

上一篇已经实现了登录认证功能&#xff0c;这一篇继续实现权限控制功能&#xff0c;文中代码只贴出来和上一篇不一样的修改的地方&#xff0c;完整代码可结合上一篇一起整理spring boot集成mybatis和springsecurity实现登录认证功能-CSDN博客 数据库建表 权限控制的意思就是根…

前端常用的工具网站

前端常用的工具网站&#x1f516; 文章目录 前端常用的工具网站&#x1f516;1. 图片在线压缩2. iconfont--矢量图标3. JSON在线格式化4. EMOJIALL--表情符号5. removebg--去除图片背景6. FREE API--免费API接口7. Lorem picsum --随机图片8.UU在线工具 -- 聚合工具 1. 图片在线…

Windows系统安装 ffmpeg

下载及解压 ffmpeg官方下载地址&#xff1a;https://ffmpeg.org/download.html 下载好后将其解压至你想保存的位置中。 环境变量设置 打开Windows设置&#xff0c;在搜索框输入&#xff1a;系统高级设置。 新建环境变量&#xff0c;并输入bin目录具体位置。 安装检查 按住 w…

图形处理工具:Photoshop Elements 2020 mac介绍说明

Photoshop Elements 2020 mac简称ps elements 2020&#xff0c;是一款图形处理工具。ps elements 2020 mac可以帮助您自动生成照片和视频作品的功能&#xff0c;采用Sensei AI技术可进行图像组织、编辑和创建等。Photoshop Elements 2020 可以帮助您轻松整理照片和视频&#xf…

【Linux】定时任务

定时任务常用crontab来定期执行程序。 crontab 基本语法 crontab [-u user] -l # 列出用户cron任务 crontab [-u user] -e # 编辑用户cron任务 crontab [-u user] -r # 移除用户cron任务cron 表达式 # 分 时 日 月 周 执行命令 minute hour day month week command # 示例…

Simulink元件

constant 输出常数/标量 这样我们就只输出了一个常数 输出一维数组/矢量 这样我们就输出了1-5一共5个数字 输出二维数组 这样我们就输出了4个数字 选择框Interpret vector parameters as 1-D 如果标量或者矩阵&#xff0c;勾与不勾都一样。 如果是向量&#xff0c;勾选则表…

Keil中文报错提示为: [-Winvalid-source-encoding]问题解决

错误提示&#xff1a; ../User/main.c(67): warning: illegal character encoding in string literal [-Winvalid-source-encoding]67 | printf("全<B2><BF><B4><AB><CA><E4><CD><EA><B3><C9…

java旅游攻略管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web旅游攻略管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

2023 第六届安洵杯 writeup

CRYPTO 010101 漏洞点在 p1[random.choice([i for i, c in enumerate(p1) if c 1])] 0p2[random.choice([i for i, c in enumerate(p1) if c 0])] 1 p1只是随机的把1的位置转一个变成0&#xff0c;p2把0的位置随机转一个到1&#xff0c;直接逆回去即可 charonroot:~/D…

Unity使用Rider作为默认编辑器

01.Edit -> Preferences 02.Externel Tools -> Open by file extension 如果界面选项有Rider直接选择&#xff0c;如果没有选择Browse) 03.选择rider64.exe 04.成功关联

Qt的简单游戏实现提供完整代码

文章目录 1 项目简介2 项目基本配置2.1 创建项目2.2 添加资源 3 主场景3.1 设置游戏主场景配置3.2 设置背景图片3.3 创建开始按钮3.4 开始按钮跳跃特效实现3.5 创建选择关卡场景3.6 点击开始按钮进入选择关卡场景 4 选择关卡场景4.1场景基本设置4.2 背景设置4.3 创建返回按钮4.…

C++设计模式 #6 桥模式(Bridge)

动机 由于某些类型的固有的实现逻辑&#xff0c;使得它们具有两个变化的维度&#xff0c;乃至多个变化的维度。 如何应对这种“多维度的变化”&#xff1f;如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化&#xff0c;而不引入额外的复杂度 举个栗子 我们…

JavaOOP篇----第十五篇

系列文章目录 文章目录 系列文章目录前言一、有没有可能两个不相等的对象有相同的hashcode二、拷贝和浅拷贝的区别是什么?三、static都有哪些用法?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通…