什么';在Java 5/6中,检查字符串是否为空比使用String.trim().length()更好的方法是什么?

什么';在Java 5/6中,检查字符串是否为空比使用String.trim().length()更好的方法是什么?,java,string,Java,String,在Java5/6中,可能有一种方法可以返回字符串中第一个非空字符的索引。但是我再也找不到了。一个代码分析工具说它比检查String.trim().length()Java 6引入了String.isEmpty(),因此您可以将它与String.trim()结合使用。您还可以使用正则表达式,例如使用这样的条件:!str.matches(“\\s*”)我会使用这个类: (最佳方式)string.equals(“”) 而且 string.isEmpty() string.equals(null)

在Java5/6中,可能有一种方法可以返回字符串中第一个非空字符的索引。但是我再也找不到了。一个代码分析工具说它比检查
String.trim().length()

Java 6引入了
String.isEmpty()
,因此您可以将它与
String.trim()
结合使用。您还可以使用正则表达式,例如使用这样的条件:
!str.matches(“\\s*”)

我会使用这个类:

(最佳方式)
string.equals(“”)

而且

string.isEmpty()

string.equals(null)

字符串中有一个方法正是为了这个目的

String emptyString = "";
emptyString.isEmpty();

这将返回true。

我一直喜欢使用Apache Commons StringUtils库。它有isEmpty()和isBlank(),用于处理空格


更不用说该类和库中的许多其他有用方法了。

如果要测试长度为零的字符串,使用
isEmpty()
length()==0
是最好的方法

如果要测试字符串是否只包含空格,则搜索第一个非空格字符会更有效,因为不会创建中间对象(如
trim()


但无论如何,我也推荐Apache的commons
StringUtils.isEmpty()
,因为它很好地封装了所有这些内容。

如果您想测试它是否只包含空格字符,可以使用正则表达式

string.matches("\\s*")

认为它比trim()更有效。isEmpty(),特别是如果您希望使用空格和长字符串,尽管我不确定编译正则表达式需要多少努力。

好的,伙计们,我终于从PMD规则中找到了它:

无效清空字符串检查:
自: PMD 3.6
String.trim().length()是一个 检查字符串是否为空的低效方法 实际上是空的,因为它创建了一个新的 字符串对象以检查其大小。 考虑创建静态函数 在字符串中循环,检查 每个字符上都有Character.isWhitespace() 字符,如果 找到非空白字符

这只是PMD的建议。采用与否取决于哪个优先:程序的效率还是程序员的时间。

试试看

  str!=null && str.trim().isEmpty()
Java11引入了“isBlank”方法。看

如果字符串为空或仅包含空白代码点,则返回true,否则返回false


我总是精确地执行trim().length(),并且不会因为这样一个小的低效而失眠。因为trim()创建了String()的一个新实例,我猜。它共享字符存储,但String实例本身是在堆中分配的。对于大量的检查,它会使碎片堆变得相当多。@road:
trim()
仅当它的内容与调用它的
字符串不同时,才会返回一个新的
字符串,否则它会返回自身(甚至有文档记录,因此您可以依赖它!)。因此,新的
String
实例仅在
字符串的开头或结尾有空格的情况下创建(通常很少)。通常很少?这在很大程度上取决于数据。对于某些输入,尾随空格是常见的。
string.length()==0
远比
string.equals(“”
不太适合只包含空格的字符串。
string.equals(null)
总是返回false或抛出NullPointerException。可能是s.matches(“\\s*”);那么你也会这么做吗?我个人更喜欢尽可能地坚持JRE libs…@road:实际上:是的,也一样。严格来说,它只测试有限的空白字符子集,而
CharMatcher.whitespace
包含所有Unicode空白字符。另外,
.matches()
每次都需要编译正则表达式,这可能会比较慢。不确定“\\s”是否匹配有限的子集。和regexp——我可以编译它一次并在实用程序方法StringUtils.isBlank中使用。@road:根据它匹配
[\t\n\x0B\f\r]
。这意味着许多其他空白字符,例如。。。未检测到)。然而,我不知道这在实践中会有多大的不同。是的,只是到处阅读文档。需要为Su提交一个bug。。。我是说甲骨文!:)问题是trim()。它创建(或可能创建一个新的字符串实例)的效率不高。@VladimirDyuzhev这正是我所期望的,但当我切换到.isEmpty()而不是.length()==1时,PMD停止标记它,尽管我保留了.trim()(从@Joachim Sauer处学习)中的.trim()并不像CharMatcher那样支持所有Unicode!;)如果你在下面引用他的评论,他列出的3个unicode字符中的2个可以使用StringUtils。除非我做错了什么,否则StringUtils.isBlank((Character.toString('\u200A'));返回true,而isEmpty返回false,这应该是正确的。对于\u3000也是如此。\u202F不被Java Character.isWhiteSpace认为是空的,所以我不确定我是否希望StringUtils为此返回true。StringUtils.isEmpty()自v2以来不修剪字符串。来自javadoc:“注意:此方法在Lang 2.0版中更改。它不再修剪字符串。此功能在isBlank()中可用。”但这与
string.trim().length()==0
!只需将第一行更改为
string emptyString=“\n”
。您的代码将返回false,而String.trim().length()==0将返回true。
  str!=null && str.trim().isEmpty()