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行带有转义字符的StringisEmpty()返回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上找到源代码。