有效java:q比较(等于与==)

有效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

有效的Java 2e,第43页

主题:检查参数的字段是否与此对象的相应字段匹配

某些对象引用字段可能合法地包含null。避 如果可能出现NullPointerException,请使用此习惯用法 比较这些字段:

(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她没有说它们是相同的。她说一个暗示另一个。很好的例子,谢谢。在本文中,“字段”并不单独引用字符串,而是指任何对象。