“听说没有,那个 Java 大叔又升级了他的武器,好像是叫 JDK 13 了?”路人甲在茶馆里跟圈子里的几个小伙伴边喝茶边吹水。
“我X,Java 大叔是要上天了吧,但是他能带着他的粉丝们飞吗?据我了解,他的粉丝们还用着他 5 年前赐给大众的 JDK 8 呢!” Storm 急着抢话了。
“我说 Storm 老哥,亏你之前还是用 Java 写过不少 APP 的大神呢,你怎么能不知道现在 Java 大叔就是每半年会升级一次他的武器的呢?他在今年 3 月份才刚发布了 JDK 12 啊,这么大的事情你居然会不了解?是不是最近自由了,不写代码后膨胀了?”路人甲抓住机会,赶紧抢白一翻这位好基友,要知道,平时路人甲总是被 Storm 在朋友圈里调侃啊。
“这......这......,我哪有膨胀了,只是最近确实忙着写文章,又要维护星球,这找上门来的广告商也确实有点多。” Storm 赶紧辩解,“呃,小甲,你还不了解我的时间表吗?这昨天才在这个茶馆里介绍了那个卖保险的孙总给你认识,你这小子不会这么快就忘了吧?别扯这些没用的了,快给我说说这次 Java 大叔的新武器有什么新特性吧!?” Storm 毕竟是曾经的技术大 V 啊,在技术的新动态上也不能显得太无知不是?
听 Storm 这么一说,路人甲感到不好意思了,便快快地赔不是,并开始介绍起 JDK 13 的新特性来了。
“说实话,自从我转投 Python 阵营之后,我对 Java 大叔的武器也不是很了解,毕竟他的武器更新换代太快了,只是最近刚好看到有文章写了 JDK 13,介绍了它的几个新特性。” 路人甲淡淡地喝了一口手中的绿茶,开始讲述了。
JDK 13 共有五大特性:
350: Dynamic CDS Archives
351: ZGC: Uncommit Unused Memory
353: Reimplement the Legacy Socket API
354: Switch Expressions (Preview)
355: Text Blocks (Preview)
“第一个特性是 Dynamic CDS Archives,翻译过来就是【动态类数据共享归档】。”路人甲又笑嘻嘻地对 Storm 说:“哥,这个 CDS 估计你还没听说过吧?据说这是上个版本的特性了,可以让不同 Java 进程之间共享一份类元数据,减少内存占用,它还能加快应用的启动速度呢!而这次的这个动态 CDS ,就是希望增强 CDS 的使用,让应用在执行之后,动态地做类归档,使得一些在默认基础 CDS 上不包括的类也能动态地加进去。”
Storm 一听,这 CDS 确实是没听过啊,但他又不能显得自己太无知,就轻声说:“嗯,能共享减少内存占用,还能动态调整,这很灵活嘛。”
“第二个特性是 ZGC:Uncommit Unused Memory,这个特性就是在垃圾回收过程中,会把未使用的内存释放归还给操作系统。”路人甲接着说,“ZGC 是在 JDK 11 的时候提供的一个垃圾回收器,号称不管你开了多大的堆内存,它都能保证在 10 毫秒内释放 JVM ,不让它停顿在那。但是,当时的设计是它不能把内存归还给操作系统,而之前的 G1 回收器就已经实现了内存归还。对于比较关心内存占用的应用来说,肯定希望进程不要占用过多的内存空间了,所以这次增加了这个特性。”
“第三个特性是 Reimplement the Legacy Socket API,重新实现了古老的 Socket 接口。现在已有的 java.net.Socket 和 java.net.ServerSocket 以及它们的实现类,都可以回溯到 JDK 1.0 时代了。它们的实现是混合了 Java 和 C 的代码的,维护和调试都很痛苦。实现类还使用了线程栈作为 I/O 的缓冲,导致在某些情况下还需要增加线程栈的大小。而支持异步关闭的操作是通过使用一个本地的数据结构来实现的,这种方式这些年来也带来了潜在的不稳定性和跨平台移植问题。该实现还存在几个并发问题,需要彻底解决。在未来的网络世界,要快速响应,不能阻塞本地方法线程,当前的实现不适合使用了。全新实现的 NioSocketImpl 是 PlainSocketImpl 的替代。它便于维护和调试,与 NewI/O (NIO) 使用相同的 JDK 内部结构,因此不需要使用系统本地代码。它与现有的缓冲区缓存机制集成在一起,这样就不需要为 I/O 使用线程栈。它使用 java.util.concurrent 锁,而不是 synchronized 同步方法,增强了并发能力。”
“第四个特性是 Switch Expressions (Preview),switch 表达式,这个特性哥你肯定懂。”路人甲不忘提醒一下 Storm,“我们以前写 Java 代码,用 switch 语句的时候,不能作为表达式给变量赋值,还要记得在每个 case 分支里加上 break 关键字才行。而这次的 switch 表达式特性,就支持了把 switch 作为表达式语句,还能在每个 case 里省掉了 break 关键字。哥你看以下示例。”
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
};
“看到了吧,这样写简洁多了。”路人甲兴奋地介绍说。
Storm 一看,心中一喜,笑着说:“这个语法我见过,Kotlin 家的 when 表达式就是这么干的!”
“哥不愧是 Android 大神啊,Google 力挺 Kotlin 作为 Android 第一开发语言,哥就掌握了 Kotlin 的语法精粹了。”路人甲赶紧拍了个马屁。
“你就别给我戴高帽了,还有第五个特性呢?” Storm 问道。
路人甲不敢怠慢,急忙介绍说:“这第五个特性嘛,想必哥也是很熟悉了,它叫 Text Blocks (Preview),文本块。这跟 Kotlin 里的文本块也是差不多,请看以下示例。”
HTML 示例
原有方式:
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\n";
新特性方式:
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
SQL 示例
原有方式:
String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" +
"WHERE `CITY` = 'INDIANAPOLIS'\n" +
"ORDER BY `EMP_ID`, `LAST_NAME`;\n";
新特性方式:
String query = """
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = 'INDIANAPOLIS'
ORDER BY `EMP_ID`, `LAST_NAME`;
""";
“是啊,这个新特性我喜欢,以前写代码不能让一行代码太长,字符串长了换行就要用加号拼接,很不直观,复制出来到别的地方使用还要把加号和引号去掉,太烦人了。想不到 Java 大叔到 JDK 13 才更新他的武器,给粉丝们提供便利啊。” Storm 感慨说。
“谁说不是呢,这些年很多 Java 粉丝已经讨厌写那些冗长难看的代码了,有些转投到高效的 Python 门下,有的转用 Kotlin,有的去了新兴的 Go 那边。不过,Java 大叔凭着其广阔的领土,活跃高效的运转机构,以及其开放改革的心,还会有不少的粉丝追随他的。”路人甲赶紧附和道。
“你们两个靠写文章吃饭的小子,今天怎么吹起写代码来了?那个,《极客时间》又出新专栏了,你们有没档期帮忙推广啊?”
路人甲和 Storm 抬头一看,池大来了。
参考:
JDK 13 的项目页面
https://openjdk.java.net/projects/jdk/13/
作者语:
以上人物场景均为本人杜撰。JDK 的新特性我确实是追不动了,现在还停留在 JDK 8 的世界里,大家如果对新技术感兴趣,还是进入官方项目页面看第一手信息吧。
网友评论