有效java:q比较(等于与==)
有效的Java 2e,第43页 主题:检查参数的字段是否与此对象的相应字段匹配 某些对象引用字段可能合法地包含null。避 如果可能出现NullPointerException,请使用此习惯用法 比较这些字段:有效java:q比较(等于与==),java,arguments,equals,Java,Arguments,Equals,有效的Java 2e,第43页 主题:检查参数的字段是否与此对象的相应字段匹配 某些对象引用字段可能合法地包含null。避 如果可能出现NullPointerException,请使用此习惯用法 比较这些字段: (field == null ? o.field == null : field.equals(o.field)) 如果经常使用field和o.field,则此替代方案可能会更快 相同: (field == o.field || (field != null &&am
(field == null ? o.field == null : field.equals(o.field))
如果经常使用field和o.field,则此替代方案可能会更快
相同:
(field == o.field || (field != null && field.equals(o.field)))
他是在暗示field.equals(o.field)产生与field==o.field相同的行为吗?
有人能解释一下第二种选择是如何工作的吗
(field==o.field | |(field!=null&&field.equals(o.field)))
如果它们都为null,则为true
如果字段
为空,它将安全地短路到false
如果o.field
为空,则字段
对象将负责检查o.field
中的空值,这是正常的
如果它们是相同的-也就是说,它们是相同的对象,而不仅仅是根据equals()相等-这将快速返回true和complete
如果它们都不为null且不相等,则其计算结果将为false
他是否暗示field.equals(o.field)产生与field==o.field相同的行为
不,当然不是,Java程序员学到的第一件事就是不要将字符串与==进行比较,因为它们不一样
(field == o.field || (field != null && field.equals(o.field)))
逐字读译成
If both are null or they are interned then they are `equal`.
If they are not equal and field is not null,
Then the strings may have equality even if they are not interned.
So do a content check for equality of the strings
基本上,他说的是,如果string1==string2
,那么它们都是null
,或者都是notnull
,如果两者都不是null并且相等,那么字符串必须是内接的。但是如果string1!=string2
那么有一件事是真的
字段为空或o.field为空
字符串具有不同的内容
这些字符串具有相同的内容,并且它们不是临时的
这样做的好处是,您不必总是进行长度相等的比较,然后逐个字符进行比较。如果两个字符串都非常非常长,这可能会非常慢
代码示例:
public class InternedDemo {
public static void main(String[] args) {
String s1 = "hello world";
String s2 = "hello world";
String s3 = new String("hello world");
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
System.out.println(s2 == s3); // false
System.out.println(s1.equals(s3)); // true
System.out.println(s2.equals(s3)); // true
}
}
如果它们指向同一个地方,它们就是同一个对象,同一个实例,因此它们的观测性相等。说得稍微不同,对于符合equals契约的任何实现,如果field不为null,则field==o.field
意味着field.equals(o.field)
@PatriciaShanahan==测试引用相等,而.equals测试值相等,因此它们可能不是相同的对-@Nik她没有说它们是相同的。她说一个暗示另一个。很好的例子,谢谢。在本文中,“字段”并不单独引用字符串,而是指任何对象。