关于 Java12 的一切——新特性、安全性和 Switch 表达式语句(示例)
已发表: 2019-04-07 19th March 2019
,Java12 发布。 众所周知, Java12
是快速发布的一部分,它在 Java11 发布后仅 6 个月就发布了。
在本教程中,我们将介绍有关 Java12 的所有更改和新功能。
就我个人而言,我的所有开发都切换到了 Java12,但对于生产周期来说还为时过早。 如果您想为所有生产项目切换到 Java12,请将本教程添加为书签。
Java12 有什么新功能? Java12 的新特性:
Java12 中有很多内部和用户工作流相关的特性发生了变化。 让我们来看看 Java 12 里面有什么。
Change-1) 并发类卸载
普通垃圾收集器通常在 GC 循环期间卸载未使用的变量,我们通常会注意到进程中的一些暂停/暂停,或者在此期间 CPU 增加。 通常我们甚至不会注意到这一点。
使用ZGC
(Z Garbage Collector) – Java12 也支持并发类卸载。 由于这发生在正常的 GC 周期中,因此没有任何暂停,也没有更多的内存额外使用。
默认情况下,Java12 中启用了 ZGC。 无需更多操作
如何禁用 ZGC?
- 只需使用 JVM 命令行参数
-XX:-ClassUnloading
启动您的应用程序
Change-2) 获取有关 JVM Crash 的更多详细信息
当出现 OOM(Out Of Memory)错误或 JVM 崩溃时,Java 通常会创建包含所有详细信息的转储文件。
1 |
- XX : HeapDumpPath =/ tmp / crunchify / - XX : + HeapDumpOnOutOfMemoryError |
使用此 JVM 参数,将在 OOM 错误时在/tmp/crunchify/
文件夹下创建转储文件。
Java12 中又增加了一个选项:
1 |
- XX : + ExtensiveErrorReports |
将创建名为hs_err<pid>.log
的新日志文件,其中包含有关 JVM 崩溃的所有详细信息。 如果您看到频繁的崩溃并想要进行更多调试,这对您的生产环境非常有帮助。
默认情况下它是禁用的,但您可以通过添加上面的 JVM 命令行参数来启用广泛的崩溃报告。
Change-3) 紧凑数字格式
java.text 添加了对紧凑数字格式的支持。 100o
可以称为1K
, 100000
可以称为100K
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package crunchify . com . tutorials ; import java . text . NumberFormat ; import java . util . Locale ; /** * @author Crunchify.com * Java12 Compact Number format example * */ public class CrunchifyJava12CompactNumber { public static void main ( String args [ ] ) { // NumberFormat is the abstract base class for all number formats. // This class provides the interface for formatting and parsing numbers. NumberFormat also provides methods for determining which locales have number formats, and what their names are. NumberFormat crunchifyFormat = NumberFormat . getCompactNumberInstance ( Locale . US , NumberFormat . Style . SHORT ) ; // getCompactNumberInstance returns a compact number format for the specified locale and formatStyle. String crunchifyResult = crunchifyFormat . format ( 100000 ) ; System . out . println ( "NumberFormat.Style.SHORT Result: " + crunchifyResult ) ; } } |
结果:
1 |
NumberFormat . Style . SHORT Result : 100K |
Change-4) Java 安全性增强
security-libs/java.security
更改:
- 禁止和允许 java.security.manager 的选项
- 如果
disallow
,则 System.setSecurityManager
不能用于设置安全管理器。
- 如果
- -groupname 选项添加到 keytool 密钥对生成
- 用户可以在生成密钥对时指定一个命名组。
- 自定义
PKCS12 keystore
生成- 包括算法和参数
- 密钥保护
- 证书保护
- 麦克数据
- 包括算法和参数
- 新的 JFR 安全事件
- 什么是 JFR(Java 飞行记录器)
- 添加了 4 个新的 JFR 事件
- jdk.X509证书
- jdk.X509验证
- jdk.TLS握手
- jdk.SecurityPropertyModification
Change-5) JEP 325:切换表达式
Java12 现在支持增强型Switch statement
。
- 基于 Java 12 的
case L -> syntax
操作。 这里没有任何休息的必要。 - 开关表达式的使用
- 这是简化的 switch 语句
- 如果标签匹配,则仅执行箭头标签右侧的表达式。
- 不需要中断语句。
CrunchifyJava12SwitchExample.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
package crunchify . com . tutorials ; import java . util . Scanner ; /** * @author Crunchify.com * What's new in Java12 Switch statement? * */ public class CrunchifyJava12SwitchExample { public static void main ( String [ ] args ) { Scanner crunchifyObj = new Scanner ( System . in ) ; log ( "Enter company name from: Google, Facebook, PayPal, eBay, Twitter, LinkedIn, Apple" ) ; String company = crunchifyObj . nextLine ( ) ; log ( "Selected Company: " + company ) ; // Pre-Java12 Switch statement switch ( company ) { case "Google" : case "Facebook" : case "PayPal" : case "eBay" : case "Twitter" : log ( "Pre-Java12: This switch is for companies Google, Facebook, PayPal, eBay & Twitter" ) ; break ; case "" : case "Apple" : case "LinkedIn" : log ( "Pre-Java12: This switch is for companies Apple & LinkedIn" ) ; break ; default : log ( "Pre-Java12: Oops... Invalid company" ) ; } /** * Java 12 based case L -> syntax operation. * Here there isn't any break necessary. */ switch ( company ) { case "Google" , "Facebook" , "PayPal" , "eBay" , "Twitter" - > log ( "Java12: This switch is for companies Google, Facebook, PayPal, eBay & Twitter" ) ; case "Apple" , "LinkedIn" - > log ( "Java12: This switch is for companies Apple & LinkedIn" ) ; default - > { log ( "Java12: Oops... Invalid company" ) ; } } /** * This is switch expression */ final String companyName ; companyName = switch ( company ) { case "Google" , "Facebook" , "PayPal" , "eBay" , "Twitter" - > ( "Java12 Expression: This switch is for companies Google, Facebook, PayPal, eBay & Twitter" ) ; case "Apple" , "LinkedIn" - > ( "Java12 Expression: This switch is for companies Apple & LinkedIn" ) ; /** * it's also possible to do switch operation without a block and break */ default - > { break "Java12 Expression: Oops... Invalid company" ; } } ; log ( companyName ) ; } public static void log ( String result ) { System . out . println ( result ) ; } } |

IntelliJ IDEA 结果:
1 2 3 4 5 6 7 8 |
Enter company name from : Google , Facebook , PayPal , eBay , Twitter , LinkedIn , Apple Twitter Selected Company : Twitter Pre - Java12 : This switch is for companies Google , Facebook , PayPal , eBay & Twitter Java12 : This switch is for companies Google , Facebook , PayPal , eBay & Twitter Java12 Expression : This switch is for companies Google , Facebook , PayPal , eBay & Twitter |
Change-6) JVM 常量 API
java.lang.invoke.constant
:您可能知道,Java 类有一个常量池,它在运行时存储所有操作数。
Java12 添加了用于在运行时调用常量的 API。
从 Java12 中删除的功能:
Java12 中已弃用的功能:
如果您想在此处包含有关 Java12 的任何方便的教程,请告诉我。