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 != "";
底线是:

  • 将第一种情况用于字符串之间的比较
  • 使用
    myString==null
    进行null测试
  • 千万不要用第三个
您的每个示例都不同

  • 第一个是一个简单的比较,看看
    myString
    是否为空(一个没有字符的字符串)
  • 第二个始终为false或
    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

  • 如果myString引用的字符串表示空字符串,则返回true
  • 将始终返回false
  • 如果myString恰好引用与“”相同的字符串实例,则将返回true。这在你的程序中可能是正确的,但也可能是错误的
  • 只需使用apachecommons

    编辑:要使用@zim2001的方法实现您的目标,请执行以下操作:

    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 for
    null
    的版本。等等,如果字符串为空,那么它并不意味着它为null?@Gandalf,这取决于你所说的“empty”是什么意思
    null
    null
    :-),
    是空的
    String
    “\t\n”
    是带空格的
    字符串或更正确的说法whitespaces@Gandalf在随意的讲话中,人们可能会说,
    null
    是一个空的
    字符串
    ,这在技术上是不正确的。