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

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


在这里插入图片描述

解锁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.mzph.cn/news/291696.shtml

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

相关文章

.NET6之MiniAPI(十四):跨域CORS(上)

为了说明跨请求&#xff0c;创建了两个项目&#xff0c;一个mini api&#xff0c;端口是5001&#xff0c;另一个razor page项目&#xff0c;端口是5280。5280项目会在页面用ajax的方式来请求5001&#xff0c;形成跨域请求&#xff0c;由于是本地测试&#xff0c;host都是localh…

django model filter 条件过滤,及多表连接查询、反向查询,某字段的distinct

2019独角兽企业重金招聘Python工程师标准>>> 1.多表连接查询&#xff1a;当我知道这点的时候顿时觉得django太NX了。 class A(models.Model): name models.CharField(u名称) class B(models.Model): aa models.ForeignKey(A)B.objects.filter(aa__name__c…

利用tabluea分析数据的案例_利用德温特分析Dartsip的案例检索结果

德温特创新平台(Derwent Innovation)与Darts-ip知识产权案例数据库均是科睿唯安旗下的知识产权数据库&#xff0c;虽然这两个数据库的侧重点分别在于专利信息与知识产权判例&#xff0c;但若将两者结合使用则能发挥11>2的作用&#xff0c;打通专利全生命周期。关注我们的朋友…

linux网络编程之怎么配置好unp.h文件

1、获取unp源码 下载地址:http://www.unpbook.com/src.html 然后用tar -zxvf unpv13e.tar.gz命令解压 2、进入unpv13e目录执行configure cd unpv13e ,然后执configure文件 3、打开README文件,使用make命令 打开README文件

客户端禁用Keep-Alive, 服务端开启Keep-Alive,会怎么样?

最近部署的web程序&#xff0c;服务器上出现不少time_wait的tcp连接状态&#xff0c;占用了tcp端口&#xff0c;花费几天时间排查。之前我有结论&#xff1a;HTTP keep-alive 是在应用层对TCP连接的滑动续约复用&#xff0c;如果客户端、服务器稳定续约&#xff0c;就成了名副其…

linux网络编程之一般应用采用的协议和不同套接字的地址结构以及用户进程和内核通过哪些函数传递套接字的地址结构

1、一般应用采用的协议 2、不同套接字的地址结构 3、用户进程和内核通过哪些函数传递套接字的地址结构 从进程到内核传递套接字的地址结构函数有3个 bind、connect、sendto函数 从内核到进程传递套接字的地址结构函数有4个函数 accept、recvfrom 、getsockname 、getpeername…

四则运算2测试

这是测试程序在输入任意字符时能否正常运行 1&#xff09;按程序提示正确输入 结果无错 2)当输入错误的字符&#xff0c;如字母等&#xff0c;程序出错&#xff08;错误提示无限循环&#xff09; 这一错误我经过长时间反正为解决&#xff0c;于是请教了其他同学&#xff0c;发现…

2020-11-04关于出现tomcat启动失败的一种原因

点击run on server后出现了如下所示&#xff1a; 本来是运行正常的&#xff0c;后来因为我将exp5里面所有的文件都复制了一遍&#xff0c;放到了exp5_2里面后&#xff0c;如下所示&#xff1a; 此时&#xff08;复制文件夹之前&#xff09;若tomcat已经启动&#xff0c;则不会出…

HTTP协议快速入门

一、定义 The Hypertext Transfer Protocol (HTTP) is an application protocol for distributed, collaborative, hypermedia information systems. HTTP is the foundation of data communication for the World Wide Web. Hypertext is structured text that uses logical l…

删除含有关键词的文件_AweEraser——macOS Catalina最佳的文件粉碎机

您是否正在寻找适用于macOS Catalina的好的文件粉碎机&#xff1f;今天macdown为大家推荐一种永久删除数据的软件——AweEraser。有时&#xff0c;你要销毁或擦除计算机上的所有私人文件&#xff0c;这意味着这些数据必须受到保护&#xff0c;免受他人的侵害。本地硬盘或外部硬…

linux网络编程之用一张图片说明函数inet_ntop、inet_pton、inet_addr、inet_ntoa 、inet_aton函数之间的关系

1、inet_ntop、inet_pton、inet_addr、inet_ntoa 、inet_aton函数之间的关系 2、inet_ntop、inet_pton函数的源代码 1、inet_pton函数源码 int inet_pton(int family, const char *strptr, void *addrptr) {if (family == AF_INET) {struct in_addr in_val;if (inet_aton(s…

聊一聊如何用C#轻松完成一个TCC分布式事务

背景 银行跨行转账业务是一个典型分布式事务场景&#xff0c;假设 A 需要跨行转账给 B&#xff0c;那么就涉及两个银行的数据&#xff0c;无法通过一个数据库的本地事务保证转账的 ACID &#xff0c;只能够通过分布式事务来解决。在 聊一聊如何用C#轻松完成一个SAGA分布式事务…

Xcode6.1 模拟器路径

Xcode 5的iOS模拟器的应用的目录是在~/Library/Application Support/iPhone Simulator/<iOS_Version>/Applications/{Application_ID} Xcode 6的目录改为~/Library/Developer/CoreSimulator/Devices/{Device_ID}/data/Containers/Bundle/Application/{Application_ID}/这…

新年伊始 .Net7 preview1 发布!

虎年伊始&#xff0c;.NET 7.0就要来了&#xff0c;还学的动吗&#xff1f;从github能看到&#xff0c;截止到2月8号&#xff0c;.NET 7.0 Preview1已经全部开发完成&#xff0c;连Preview2也完成了85%&#xff0c;这进度杠杠的&#xff01;微软这几年大力推进.NET稳定更新&…

数据挖掘课程实验(8个实验报告)

是从实验一到实验八的 链接&#xff1a;https://download.csdn.net/download/qq_44872173/15558967

hutol json null值没了_JSON数据处理框架Jackson精解第一篇-序列化与反序列化核心用法...

Jackson是Spring Boot默认的JSON数据处理框架&#xff0c;但是其并不依赖于任何的Spring 库。有的小伙伴以为Jackson只能在Spring框架内使用&#xff0c;其实不是的&#xff0c;没有这种限制。它提供了很多的JSON数据处理方法、注解&#xff0c;也包括流式API、树模型、数据绑定…

Linux网络操作系统实验报告(1~12)

共12个 链接在此&#xff1a;https://download.csdn.net/download/qq_44872173/15559247 如下是目录&#xff1a; 实验一部分标题如下&#xff1a;

解读WPF中的Binding

1.Overview基于MVVM实现一段绑定大伙都不陌生&#xff0c;Binding是wpf整个体系中最核心的对象之一这里就来解读一下我花了纯两周时间有哪些秘密。这里我先提出几个问题应该是大家感兴趣的&#xff0c;如下&#xff1a;&#xff08;1&#xff09;INotifyPropertyChanged是如何被…

maven 导入数据库

2019独角兽企业重金招聘Python工程师标准>>> 一.mysql 配置 基本代码 1. pom.xml 文件配置:jeesite.property jdbc.typemysql jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/yaoshi?useUnicodetrue&characterEncodingutf-8 jdbc.user…