gpt4 book ai didi

java - 在 Java 中检查非空、非空字符串

转载 作者:IT老高 更新时间:2023-10-28 13:53:41 25 4
gpt4 key购买 nike

我正在尝试检查 Java 字符串是否不是 null、不为空且不是空格。

在我看来,这段代码应该很适合这项工作。

public static boolean isEmpty(String s) {
if ((s != null) && (s.trim().length() > 0))
return false;
else
return true;
}

根据文档,String.trim()应该这样工作:

Returns a copy of the string, with leading and trailing whitespace omitted.

If this String object represents an empty character sequence, or the first and last characters of character sequence represented by this String object both have codes greater than '\u0020' (the space character), then a reference to this String object is returned.

但是,apache/commons/lang/StringUtils.java 的做法略有不同。

public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}

根据文档,Character.isWhitespace() :

Determines if the specified character is white space according to Java. A character is a Java whitespace character if and only if it satisfies one of the following criteria:

  • It is a Unicode space character (SPACE_SEPARATOR, LINE_SEPARATOR, or PARAGRAPH_SEPARATOR) but is not also a non-breaking space ('\u00A0', '\u2007', '\u202F').
  • It is '\t', U+0009 HORIZONTAL TABULATION.
  • It is '\n', U+000A LINE FEED.
  • It is '\u000B', U+000B VERTICAL TABULATION.
  • It is '\f', U+000C FORM FEED.
  • It is '\r', U+000D CARRIAGE RETURN.
  • It is '\u001C', U+001C FILE SEPARATOR.
  • It is '\u001D', U+001D GROUP SEPARATOR.
  • It is '\u001E', U+001E RECORD SEPARATOR.
  • It is '\u001F', U+001F UNIT SEPARATOR.

如果我没记错 - 或者我没有正确阅读它 - String.trim() 应该带走 Character 正在检查的任何字符。 isWhiteSpace()。所有这些都高于 '\u0020'

在这种情况下,更简单的 isEmpty 函数似乎涵盖了更长的 isBlank 涵盖的所有场景。

  1. 是否有一个字符串会使 isEmptyisBlank 在测试用例中表现不同?
  2. 假设没有,是否有任何其他考虑,因为我应该选择 isBlank 而不使用 isEmpty

对于那些对实际运行测试感兴趣的人,这里是方法和单元测试。

public class StringUtil {

public static boolean isEmpty(String s) {
if ((s != null) && (s.trim().length() > 0))
return false;
else
return true;
}

public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
}

单元测试

@Test
public void test() {

String s = null;
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s)) ;

s = "";
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s));

s = " ";
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s)) ;

s = " ";
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s)) ;

s = " a ";
assertTrue(StringUtil.isEmpty(s)==false) ;
assertTrue(StringUtil.isBlank(s)==false) ;

}

更新:这是一次非常有趣的讨论——这就是我喜欢 Stack Overflow 和这里的人们的原因。顺便说一句,回到问题,我们得到:

  • 一个程序,显示哪些所有字符会使行为不同。代码在https://ideone.com/ELY5Wv .谢谢@Dukeling。
  • 选择标准 isBlank() 的性能相关原因。谢谢@devconsole。
  • @nhahtdh 的全面解释。谢谢老兄。

最佳答案

Is there a string that will make the isEmpty and isBlank behave differently in a test case?

请注意 Character.isWhitespace 可以识别 Unicode 字符并返回 true用于 Unicode 空白字符。

Determines if the specified character is white space according to Java. A character is a Java whitespace character if and only if it satisfies one of the following criteria:

  • It is a Unicode space character (SPACE_SEPARATOR, LINE_SEPARATOR, or PARAGRAPH_SEPARATOR) but is not also a non-breaking space ('\u00A0', '\u2007', '\u202F').

  • [...]

另一方面,trim()方法将修剪所有代码点低于 U+0020 和空格字符 (U+0020) 的控制字符。

因此,如果存在 Unicode 空白字符,这两种方法的行为会有所不同。例如:"\u2008" . 当字符串包含不被 Character.isWhitespace 视为空白的控制字符时方法。例如:"\002" .

如果您要编写一个正则表达式来执行此操作(这比通过字符串循环并检查要慢):

  • isEmpty()相当于.matches("[\\x00-\\x20]*")
  • isBlank()相当于.matches("\\p{javaWhitespace}*")

(isEmpty()isBlank() 方法都允许 null 字符串引用,因此它不完全等同于正则表达式解决方案,但抛开它,它是等价的。

请注意 \p{javaWhitespace} ,顾名思义,是 Java 特定的语法,用于访问由 Character.isWhitespace 定义的字符类。方法。

Assuming there are none, is there any other consideration because of which I should choose isBlank and not use isEmpty?

这取决于。但是,我认为上面部分的解释应该足以让您决定。总结一下区别:

  • isEmpty()如果字符串仅包含 U+0020 以下的控制字符1 和空格字符 (U+0020)

    ,则将认为该字符串为空
  • isBlank如果字符串仅包含 Character.isWhitespace 定义的空白字符,将认为该字符串为空。方法,其中包括 Unicode 空白字符。

1 U+007F DELETE 处还有控制字符, 未被 trim() 修剪方法。

关于java - 在 Java 中检查非空、非空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16394787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com