为了账号安全,请及时绑定邮箱和手机立即绑定

string.equalsIgnoreCase(object.string)

string.equalsIgnoreCase(object.string)

精慕HU 2021-05-06 14:46:57
假设我有一堂课:public class MyClass {    String locale;    public String getLocale(){        return this.locale;    }    public setLocale(String locale){        this.locale = locale;    }}现在我被告知,以下陈述有区别myClass.getLocale().equalsIgnoreCase("en")("en").equalsIgnoreCase(myClass.getLocale())我一直试图找到它的搜索,但无法做到。有人可以帮我解释一下两者之间的区别吗?执行时间是否有特别的区别?还有这两个中的哪一个是最佳实践
查看完整描述

3 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

该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

需要注意的是第二种方式是更强大的,如果它只会失败myClass是null在第一可能会失败或者myClass或myClass.getLocale()参考null。


总而言之,如果在您的应用程序myClass中不能null,则应坚持第二种方式。

否则,如果myClass可能null,你应该执行null前检查:


boolean isEqualIgnoreCase = false;

if (myClass != null){

   isEqualIgnoreCase = ("en").equalsIgnoreCase(myClass.getLocale());

}


查看完整回答
反对 回复 2021-05-26
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

myClass.getLocale().equalsIgnoreCase("en")抛出NullPointerExceptionmyClass.locale为空。

("en").equalsIgnoreCase(myClass.getLocale()) 不编译。

如果您正在谈论"en".equalsIgnoreCase(myClass.getLocale())myClass.locale则为null时可以正常工作。false将被退回。


查看完整回答
反对 回复 2021-05-26
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

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

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


编辑:两种解释都假定myClass本身不为null,因此只会getLocale()失败。在null的情况下,没有一个解决方案是null安全的myClass-无论如何都会抛出NPE。(@davidxxx)


查看完整回答
反对 回复 2021-05-26
  • 3 回答
  • 0 关注
  • 177 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信