从 2017 年开始,Java 版本更新策略从原来的每两年一个新版本,改为每六个月一个新版本,以快速验证新特性,推动 Java 的发展。从 《JVM Ecosystem Report 2021》 中可以看出,目前开发环境中有近半的环境使用 Java8,有近半的人转移到了 Java11,随着 Java17 的发布,相信比例会有所变化。
因此,准备出一个系列,配合示例讲解,阐述各个版本的新特性。
概述
Java11 是 2018 年 9 月发布的,是自 Java8 之后第一个长期支持版(long-term support,LTS)。相比于其他版本 6 个月维护期,长期支持版的维护期是 3 年。
长期支持版的更新会比较多,而且都是相对稳定的更新。今天我们就一起看看 Java11 都有哪些喜人的变化:增强的 API、全新的 HTTP 客户端、基于嵌套关系的访问控制优化、低开销的堆性能采用工具、ZGC、Epsilon 垃圾收集器、飞行记录器等。
增强 String
首先说下String
中新增的方法:repeat
、strip
、stripLeading
、stripTrailing
、isBlank
、lines
。这些方法还是挺有用的,以前我们可能需要借助第三方类库(比如 Apache 出品的 commons-lang)中的工具类,现在可以直接使用嫡亲方法了。
repeat
repeat
是实例方法,顾名思义,这个方法是返回给定字符串的重复值的,参数是int
类型,传参的时候需要注意:
- 如果重复次数小于 0 会抛出
IllegalArgumentException
异常; - 如果重复次数为 0 或者字符串本身是空字符串,将返回空字符串;
- 如果重复次数为 1 直接返回本身;
- 如果字符串重复指定次数后,长度超过
Integer.MAX_VALUE
,会抛出OutOfMemoryError
错误。
用法很简单:
@Test
void testRepeat() {
String output = "foo ".repeat(2) + "bar";
assertEquals("foo foo bar", output);
}
小而美的一个工具方法。
strip、stripLeading、stripTrailing
strip
方法算是trim
方法的增强版,trim
方法可以删除字符串两侧的空白字符(空格、tab 键、换行符),但是对于Unicode
的空白字符无能为力,strip
补足这一短板。
用起来是这样的:
@Test
void testTrip() {
final String output = "\n\t hello \u2005".strip();
assertEquals("hello", output);
final String trimOutput = "\n\t hello \u2005".trim();
assertEquals("hello \u2005", trimOutput);
}
对比一下可以看到,trim
方法的清理功能稍弱。
stripLeading
和stripTrailing
与strip
类似,区别是一个清理头,一个清理尾。用法如下:
@Test
void testTripLeading() {
final String output = "\n\t hello \u2005".stripLeading();
assertEquals("hello \u2005", output);
}
@Test
void testTripTrailing() {
final String output = "\n\t hello \u2005".stripTrailing();
assertEquals("\n\t hello", output);
}
isBlank
这个方法是用于判断字符串是否都是空白字符,除了空格、tab 键、换行符,也包括Unicode
的空白字符。
用法很简单:
@Test
void testIsBlank() {
assertTrue("\n\t\u2005".isBlank());
}
lines
最后这个方法是将字符串转化为字符串Stream
类型,字符串分隔依据是换行符:\n
、\r
、\r\n
,用法如下:
@Test
void testLines() {
final String multiline = "This is\n \na multiline\nstring.";
final String output = multiline.lines()
.filter(Predicate.not(String::isBlank))
.collect(Collectors.joining(" "));
assertEquals("This is