【问题标题】:Difference between string.equalsIgnoreCase(object.string) vs object.string.equalsIgnoreCase(string)string.equalsIgnoreCase(object.string) 与 object.string.equalsIgnoreCase(string) 之间的区别
【发布时间】:2018-12-22 15:06:11
【问题描述】:

假设我有一堂课:

public class MyClass {
    String locale;

    public String getLocale(){
        return this.locale;
    }

    public setLocale(String locale){
        this.locale = locale;
    }
}

现在有人告诉我,以下陈述有所不同

  1. myClass.getLocale().equalsIgnoreCase("en")

  2. ("en").equalsIgnoreCase(myClass.getLocale())

我一直试图找到它的搜索,但无法这样做。谁能帮我解释一下有什么区别?

执行时间有什么特别的区别吗?还有这两者中哪一个是最佳实践

【问题讨论】:

  • 只是在写的时候输入的..没有复制实际代码
  • 谁能解释一下反对意见,我也想改进这个问题

标签: java string class object


【解决方案1】:

myClass.locale 为空时,myClass.getLocale().equalsIgnoreCase("en") 抛出 NullPointerException

("en").equalsIgnoreCase(myClass.getLocale()) 无法编译。

如果你在谈论"en".equalsIgnoreCase(myClass.getLocale()),当myClass.locale 为空时它可以正常工作。 false 将被返回。

【讨论】:

    【解决方案2】:

    我发现的唯一区别是,在第一个示例中,语句 myClass.getLocale() 不是空安全的,因此可能会以某种方式返回 null 并导致 NullPointerException。

    第二个是安全的,因为您在 "en" 上调用了一个方法,该方法永远不会是 null,即使您将 null 传递给带有 myClass.getLocale() 的方法也不会失败。


    编辑:两种解释都假设myClass 本身不是空的,因此只有getLocale() 会失败。如果myClass 为空,则没有一个解决方案是空安全的——那么无论如何都会抛出NPE。 (@davidxxx)

    【讨论】:

    • 好吧,据你所知..除了空指针..代码很好,因为没有执行时间变化或任何正确的事情?
    • 唯一的区别是你的比较。第二个永远不会抛出 NPE,但第一个理论上可以。确实没有其他区别。
    • 有人可以解释一下否决票,因为我不知道有任何错误。随时纠正我并给我反馈,这样更好。
    • 明白了,你能告诉我哪一种是首选的编码方式吗?我不知道谁投了反对票,哈哈……所有答案都投了反对票
    • @Nikolas 不是反对者(你有我的投票),但请注意,如果 MyClass 为空,第二个将抛出 NPE。只是不在同一个地方。这些语句都没有执行必要的空检查来避免 NPE。
    【解决方案3】:

    String.equalsIgnoreCase(String) javadoc 声明:

    将此字符串与另一个字符串进行比较,忽略大小写。 如果两个字符串相同,则认为它们相等,忽略大小写 两个字符串中的长度和对应的字符相等 忽略大小写。

    所以这些语句的行为与String.equalsIgnoreCase(String) 相同,只要String 调用程序和String 参数不是null,就会产生相同的结果。

    唯一可能不同的是,在语句中存在 null 引用可能会引发 NullPointerException 的抛出。
    在您的示例中,这两个语句可能会出现 NullPointerException 但不在同一个地方:

    myClass.getLocale().equalsIgnoreCase("en")
        |-----|---- two potential NPE
    
    ("en").equalsIgnoreCase(myClass.getLocale())
                                |----- potential NPE
    

    请注意,第二种方法更健壮,因为它仅在 myClassnull 时才会失败,而第一种方法对于 myClassmyClass.getLocale() 可能会失败,请参阅 null

    总而言之,如果在您的应用程序中 myClass 不能是 null 您应该坚持第二种方式。
    否则,如果myClass 可能是null,您应该在之前执行null 检查:

    boolean isEqualIgnoreCase = false;
    if (myClass != null){
       isEqualIgnoreCase = ("en").equalsIgnoreCase(myClass.getLocale());
    }
    

    【讨论】:

    • 明白了,能不能也告诉我,根据你的情况,哪个是首选方案
    • 这取决于您的应用程序。我更新以提示根据情况应该采用哪种方式。
    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2014-10-09
    相关资源
    最近更新 更多