Java中各种字符串比较之间的差异
这两者之间有区别吗Java中各种字符串比较之间的差异,java,string,Java,String,这两者之间有区别吗 if(myString.equals("")){ } if(myString.equals(null)){ } if(myString == ""){ } 我有一个字符串,我不知道它是空的还是有一些emtpy空格。如果它无效(如果是空的或有一些空格),我不想阻止它写入数据库。是的 如果字符串为空,则First将返回true 第二个总是返回false 如果字符串定义如下,则第三个将返回true: String myString = ""; 请注意,这与案例1不同!
if(myString.equals("")){
}
if(myString.equals(null)){
}
if(myString == ""){
}
我有一个字符串,我不知道它是空的还是有一些emtpy空格。如果它无效(如果是空的或有一些空格),我不想阻止它写入数据库。是的
如果字符串为空,则First将返回true
第二个总是返回false
如果字符串定义如下,则第三个将返回true:
String myString = "";
请注意,这与案例1不同!第一个测试值是否相等,而第二个测试值是否相同
String myString = "";
String myOtherString = new String(myString);
assert myString == "";
assert myOtherString.equals("");
assert myOtherString != "";
底线是:
- 将第一种情况用于字符串之间的比较
- 使用
进行null测试myString==null
- 千万不要用第三个李>
myString
是否为空(一个没有字符的字符串)NullPointerException
myString
是否引用空字符串常量。如果变量是从空字符串常量显式初始化的,或者如果变量是使用一些“生成的”空字符串(例如,new StringBuilder().toString()
)初始化的,然后使用intern()
显式添加到常量池中,则会出现这种情况正如注释中所指出的,第一个示例也可能抛出
NullPointerException
,但第三个示例可能不会抛出。要实现您想要的结果,请编写:
if (!myString.trim().equals("")) {
// write to database
}
或者如果myString
也可能是null
:
if (myString != null && !myString.trim().equals("")) {
// write to database
}
帕顿补充了正确的答案。要澄清您的尝试有什么问题,请执行以下操作:
//true if myString is the empty string. will fail on " "
if(myString.equals("")){
}
//always false, or fails
//if myString is null, you'll get a NullPointerException
//if it isn't, you'll get false
if(myString.equals(null)){
}
//a bad way to do things with unexpected results.
//when dealing with objects, == is true when each are the same object.
//two different objects that have the same content or value (e.g. clones)
//will return false using this technique
if(myString == ""){
}
Java中的字符串只是另一个对象。你的第一个比较是最正确的。它将myString与空白字符串进行比较,如果字符串也是空的(“”),则返回true。第二个比较总是错误的。第三,它比较对象的相等性(将其视为比较对象的地址)。我认为将始终返回false,除非您的字符串是string myString=“”(这一个不确定)。它们都是不同的。假设myString为非null
if ( StringUtils.isNotBlank(myString) ) {
// write to database
}
这比目前公认的答案更容易阅读。(但请参阅此处的其他帖子,了解使用字符串的细节。)如果您不需要依赖外部库,您可以使用apache commons StringUtils类,它提供了一个名为“isNotBlank()”的方法,似乎完全适合您的需要:
Checks if a String is not empty (""), not null and not whitespace only.
StringUtils.isNotBlank(null) = false
StringUtils.isNotBlank("") = false
StringUtils.isNotBlank(" ") = false
StringUtils.isNotBlank("bob") = true
StringUtils.isNotBlank(" bob ") = true
请参见此答案将非常有用,因此1和3之间没有区别?您不应该使用3,应该检查字符串等对象是否与.equals相等。但是,您应该使用==检查字符串是否为空。第二个字符串始终为false-
equals
正确处理空参数。@Péter Török:是的,equals可以使用空值,但是myString本身可能为空值,在这种情况下,确实会出现NullPointerException。@Jjuma是的,当然。不过,这与最初的问题没有多大关系。如果@Pointy考虑过这一点,我相信他在案例1中也会提到同样的问题。是的@Peter,你是对的!案例1也可以是空指针异常;我在案例二中提到了它,因为我总是在键入“总是”(好吧,几乎总是)后避险——尖刻听起来很熟悉——每当我在这里键入“总是”或“从来没有”时,我的胃也会有一种下沉的感觉——虽然NullPointerException
与equals
没有关系,但你可以说得更清楚一些,由于OP的重点是equals
的使用,我猜他正在开始学习编程,或者至少是java。将他指向API而不是解释正在发生的事情并不是最好的教学方法。在我发布之前,已经有4篇帖子在教Java了。我选择“教授”另一种方法。给猫剥皮的方法总是不止一种。此外,有关当前最佳答案,请参见@zim2001答案。是的,最好的IMO,因为它提供了一个更简洁的方法,因此比目前公认的答案更容易阅读。我不这么认为。myString可以为null,这样会抛出一个NPE。我特别建议检查null
,因为OP说我不知道它是空的还是有一些emtpy空格。但是,也许我也会添加一个带有check fornull
的版本。等等,如果字符串为空,那么它并不意味着它为null?@Gandalf,这取决于你所说的“empty”是什么意思null
是null
:-),“
是空的String
,“\t\n”
是带空格的字符串或更正确的说法whitespaces@Gandalf在随意的讲话中,人们可能会说,null
是一个空的字符串
,这在技术上是不正确的。