我在面试中被问到了这个问题。以下哪种更好使用?
MyInput.equals("Something");
或者
"Something".equals(MyInput);
感谢
我在面试中被问到了这个问题。以下哪种更好使用?
MyInput.equals("Something");
或者
"Something".equals(MyInput);
感谢
我会选择
"Something".equals(MyInput);
在这种情况下,如果 MyInput 是 null
,那么它不会抛出 NullPointerException
。equals()
的对象是 NOT NULL
。NullPointerException
以便做出某些决策或者抛出/包装它,请选择第一种方法。null
并且我并不希望它是这样,我更愿意快速失败并通过异常得到通知,而不是让它默默地失败,或者在更难以调试的情况下潜在地失败。第一种方式更易读、更自然,这是良好代码的重要组成部分。 - Kevin要成为一个与众不同的人.... :)
如果'MyInput'为空,第一行代码可能会崩溃,但这只是程序员(通常是因为C语言遗留问题)在不想断言'MyInput'可以为空时使用的一种代码便利。
如果使用第二个选项,那么也许这行代码不会导致NullPointerException,但接下来的代码行可能会。
我认为最好了解您的变量可能存在的状态,而不是依赖某些代码结构来减轻良心负担。
MyInput
为空,这也没关系。它确实有用处;) - Brian Roachnull
来表示空集合。NPE(空指针异常)非常普遍。在代码上下文中,null
几乎没有任何意义。因此,最好避免使用null
,这意味着需要进行检查。此外,在这里与之相关的是,不要试图掩盖任何错误。 - Tom Hawtin - tacklinemyInput
可能为 null
,那么请编写 myInput != null && myInput.equals("Something")
来告诉读者。是的,这样会更长,但更加信息丰富,因此值得。现在读者知道 myInput
可能为空(如果要修改代码,则是关键知识),并且知道您已经考虑到了它并将其纳入考虑范围。或者,如果您坚持要缩短代码,可以使用 Objects.equals(myInput, "Something")
。 - Ole V.V.那我们换个方式,把整个代码倒过来写怎么样?
喜欢把常量放在最前面的人,看到这样的代码会有什么感觉呢?
if ( 2 == i)
如果MyInput
为 null
,前者将引发NullPointerException
,而后者将只返回false
,因此在某些情况下可能更喜欢使用后者(或者如果您不希望MyInput
为空并且想要快速失败,则可能更喜欢前者)。
如果你想成为一个真正的聪明人,你可以指出MyInput
可能是一个特殊的String子类,它已经重写了equals
和hashcode
方法。在这种情况下,语句的顺序非常重要。
这里有一个现实生活中的例子 - 如果你想比较带有数字的字符串,并且你想忽略前导零怎么办?例如,Lecture1
将等于Lecture01
。
String
无法被子类化,所以您需要使用不同的方法或Comparator
,聪明的先生。 - Petr JanečekMyInput
是一个字符串。因此它可以是字符串的子类,也可以是其他任何类型(甚至是原始类型,在这种情况下第一种情况无法编译)。 - njzk2NullPointerException
,因此最好的答案是使用"Something".equals(myInput)
。