什么';在Java 5/6中,检查字符串是否为空比使用String.trim().length()更好的方法是什么?
在Java5/6中,可能有一种方法可以返回字符串中第一个非空字符的索引。但是我再也找不到了。一个代码分析工具说它比检查什么';在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)
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()