Java 12 新特性与功能
Java 12是Java SE的第12个版本,于2019年3月19日发布。Java 12的发布背景主要是为了帮助开发人员更加高效的进行编程工作,提高Java的性能和稳定性,并增加新特性和API。
在Java 12发布后,Oracle对该版本的维护包括两个阶段:公共更新和维护更新。公共更新阶段为期6个月,在这个阶段中,Oracle提供安全更新、错误修复和增强功能更新。同时,Oracle还向企业客户提供预览版本以测试新功能,并在下一个长期支持(LTS)版本中进行采纳。
维护更新阶段则针对企业客户,提供长期支持版本的错误修复和安全更新。在此期间,Oracle不会推出新的功能或API,而只会解决已知问题和漏洞。
1. Shenandoah垃圾收集器 (实验版)
Shenandoah垃圾收集器是Java 12引入的一项新功能,它是一种专为大型内存应用程序设计的低延迟、高吞吐量垃圾收集器。Shenandoah使用了一种名为IETF RMT(Improved Efficiency of Transport)协议的分布式预期缩短算法来实现暂停时间缩短。Shenandoah的特点包括:
- 最低暂停时间:Shenandoah的最低暂停时间可以控制在10毫秒以内。
- 分布式并发处理:Shenandoah使用分布式算法对垃圾进行处理,可以减少单次GC时暂停应用程序的时间。
- 全堆操作:Shenandoah无需在单独的年轻代和老年代之间划分内存,可以在整个堆上同时进行垃圾收集。
Shenandoah垃圾收集器在默认情况下未启用,需要通过JVM参数启用。
2. Switch表达式 (预览版)
Switch表达式是Java 12引入的另一项新功能,它使得编写Switch语句时更加简单和灵活。具体而言,Switch表达式允许每个Case分支都使用箭头操作符(->),以及省略break语句并返回一个值。
下面是一个使用Switch表达式的示例:
public class SwitchExpressionExample {
public static void main(String[] args) {
String fruit = "apple"; int price = switch (fruit) {
case "apple" -> 2; case "banana" -> 3; case "orange" -> 4; default -> throw new IllegalArgumentException("Unknown fruit: " + fruit); }; System.out.println("The price of " + fruit + " is " + price); } }
讯享网
在这个示例中,我们使用Switch表达式来计算水果的价格。我们使用箭头操作符(->)将每个Case分支映射到其对应的价格,并在Default分支中抛出异常。运行这个示例会输出The price of apple is 2。
3. 新的字符串方法和增强
Java 12还引入了一些新的字符串方法和增强,使得在处理字符串时更加灵活和方便。具体而言,Java 12提供了indent()、transform()、describeConstable()等方法。
- indent()方法:该方法可以在字符串开头添加指定数量的空格。
- transform()方法:该方法可以将字符串进行转换。
- describeConstable()方法:该方法用于检查字符串是否为常量。
下面是一个使用新的字符串方法和增强的示例:
讯享网public class StringExample {
public static void main(String[] args) {
String text = " Hello, world! "; String indentText = text.indent(4); String transformText = text.transform(s -> s.strip().toUpperCase()); boolean isConstable = text.describeConstable().isPresent(); System.out.println("Original text: " + text); System.out.println("Indented text: " + indentText); System.out.println("Transformed text: " + transformText); System.out.println("Is constable: " + isConstable); } }
在这个示例中,我们使用新的字符串方法和增强来处理一个字符串。我们使用indent()方法在字符串开头添加四个空格,并使用transform()方法将字符串首尾的空格去掉并转换成大写。我们还使用describeConstable()方法检查字符串是否为常量。
4. 新的Stream方法
Java 12提供了一个新的Stream方法,名为teeing()。该方法可以将两个操作合并为一个,并返回一个结果。这个方法对于需要同时计算多个结果的情况非常有用。
下面是一个使用teeming()方法的示例:
public class StreamExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int result = numbers.stream() .collect(Collectors.teeing( Collectors.summingInt(n -> n), Collectors.counting(), (sum, count) -> sum / count )); System.out.println("Result: " + result); } }
在这个示例中,我们使用teeming()方法计算数组中数字的平均值。我们使用Collectors.summingInt()方法计算数组中所有数字的总和,并使用Collectors.counting()方法计算数组中数字的数量。然后,我们使用lambda表达式将两个操作合并为一个,并计算数字的平均值。运行这个示例会输出平均值3。
5. Compact Number格式化
Java 12引入了Compact Number格式化,使得数字可以以更易读的方式显示。具体而言,Compact Number格式化允许数字以K、M或B等单位进行缩写,而不是完全展示它们的位数。这样可以节省空间,并且使得数字更加易于阅读。
下面是一个使用Compact Number格式化的示例:
讯享网public class CompactNumberExample {
public static void main(String[] args) {
double number = .89; NumberFormat format = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT); System.out.println(format.format(number)); } }
在这个示例中,我们使用Compact Number格式化来格式化一个数字。我们使用NumberFormat.getCompactNumberInstance()方法获取一个Compact Number实例,并使用NumberFormat.Style.SHORT枚举类型设置格式化风格为短格式。运行这个示例会输出1.2M。
6. HTTP Client API增强
Java 11引入了新的HTTP Client API,Java 12进一步增强了这个API。具体来说,Java 12为HTTP Client API添加了新的标头、身份验证功能,并提供方法以设置连接超时时间。
7. 移除项和废弃项
Java 12移除了一些不常被使用的API和工具,包括javah工具、Pack200工具和Nashorn JavaScript引擎。此外,Java 12还废弃了Unsafe类中的一些方法,并且将在未来版本中删除Unsafe类。
8. 应用程序类数据共享
Java 12引入了应用程序类数据共享(ACDS)的初始实现。该功能允许多个虚拟机在启动时共享已经预先构建的类数据,从而加快JVM的启动时间。
9. 微基准测试套件
Java 12引入了微基准测试套件(JMH),它是一个专门用于测试Java代码性能的工具。JMH通过生成随机测试数据并调用被测方法,从而测量不同的代码实现之间的性能差异。
10. 其他改进和修复
Java 12还包括一些其他的改进和修复,例如:
- 提高了G1垃圾收集器的可用性和性能。
- 修复了JIT编译器的一些问题,从而提高了代码执行速度。
- 对比Java 11版本,Java 12版本修复了许多BUG。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/50825.html