1. 引言
在Java中处理*String*
有时会令人困惑,因为我们有很多方法可以做相似的事情。
在这篇文章中,我们将探讨如何使用isEmpty()
和isBlank()
方法来验证空或空白的*String*
。尽管它们类似,但这两个方法并不相同。
2. 简要了解String.isEmpty()
我们先来看看isEmpty()
这个String
操作。简单来说,isEmpty()
方法如果String
为空,就返回true
,否则返回false
。
内部地,isEmpty()
依赖于代表String
对象文本的字节数组的长度。此外,isEmpty()
方法计算任何类型的字符来确定文本是否为空。因此,空格、制表符、换行符,或者任何可以表示为字节的字符都被视为有效字符。
让我们通过一个简单的测试来说明这一点:
@Test
public void givenString_whenCallIsEmpty_thenReturnCorrectValues() {
assertFalse("Example text".isEmpty());
assertTrue("".isEmpty());
assertFalse(" ".isEmpty());
assertFalse("\t\n\r\f".isEmpty());
}
值得注意的是,第一行的String
包含字符,所以isEmpty()
返回false
。
另一方面,第二行的String
不包含任何字符,因此isEmpty()
返回true
。
最后,对于只包含空白字符和第3、4行带有转义字符的String
,isEmpty()
返回false
。
3. 查看Java 11的String.isBlank()
Java 11中引入的isBlank()
方法与isEmpty()
基本相同,唯一的区别是它还会将只包含空白字符的String
视为真。
Java中被视为空白字符的五个字符是\\s
(空格)以及\\t
, \\n
, \\r
, 和 \\f
的转义序列。
在背后,isBlank()
方法会查找第一个非空白字符的索引。如果没有非空白字符,那个索引将等于数组的长度。最后,它会比较那个索引与字节数组的长度,以得出正确的答案。
让我们通过单元测试来验证这一点:
@Test
public void givenString_whenCallStringIsBlank_thenReturnCorrectValues() {
assertFalse("Example text".isBlank());
assertTrue("".isBlank());
assertTrue(" ".isBlank());
assertTrue("\t\n\r\f ".isBlank());
}
值得注意的是,“Example text”被认为不是空白的,因为它至少包含一个非空白字符。
此外,第二个String
不包含任何字符,所以它是空白的。
第三行的String
只包含空白字符,所以isBlank()
返回true
。
另外,最后一行的String
包含了所有被认为是空白字符的转义序列。因此,在这种情况下,isBlank()
也会返回true
。
4. 比较isBlank()
与isEmpty()
总之,isEmpty()
只有在String
不包含任何字符时才返回true
。相比之下,isBlank()
在String
不包含任何字符且所有字符都是空白字符时返回true
。
让我们用一个表格来可视化前面章节描述的所有情况下的isEmpty()
和isBlank()
的返回值。
方法
无字符
\\t
\\n
\\r
\\f
\\s
(空格)
其他任意字符
isEmpty()
true
false
false
false
false
false
false
isBlank()
true
true
true
true
true
true
false
上表总结了如果String
不包含任何字符,两个方法都会返回true
。
此外,转义序列\\t
, \\n
, \\r
, \\f
, 和 \\s
被视为空白字符,所以只有isBlank()
返回true
。而isEmpty()
对所有这些都返回true
。
最后,对于表格中未显示的任何其他字符,两个方法都返回false
。
在Java 11之前,开发人员通常使用*String.trim()
和*String.isEmpty()
的组合来验证文本只包含空白字符。然而,正如我们在教程中看到的,对于使用Java 11或更高版本的应用程序,我们可以简化为直接使用String.isBlank()
。
5. 结论
在这篇教程中,我们看到了isBlank()
与isEmpty()
之间的差异。关键的区别在于isBlank()
会返回真,当String
只包含空白字符,如某些转义序列。相反,isEmpty()
只有在String
不包含任何字符时才返回真。
如常,你可以在GitHub上找到源代码。