9
Object o1 = new Object();
Object o2 = new Object();
//o1=o2;
System.out.println(o1.equals(o2));

它返回falsetrue如果评论被删除,它可以返回。


为什么同一件事不适用于String班级?

String s1=new String();
String s2=new String();
System.out.println(s1.equals(s2));

它返回true。为什么?(因为String使用实习生或其他涉及的东西?)

4

7 回答 7

20

因为String 的 equals()比较的是内容,而不是对象本身。

公共布尔等于(对象anObject)

将此字符串与指定对象进行比较。当且仅当参数不为 null 并且是String表示与此对象相同的字符序列的对象时,结果才为真。

    /* String.equals() */
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
                if (v1[i++] != v2[j++])
                    return false;
            }
            return true;
        }
    }
    return false;
}

(链接到String.equals()的来源)

与Object 的等号对比:

类的equals方法Object实现了对象上最有区别的可能等价关系;也就是说,对于任何非空引用值xand y,当且仅当xandy引用同一个对象(x == y具有值true)时,此方法才返回 true。

/* Object.equals() */
public boolean equals(Object obj) {
    return (this == obj);
}

(链接到Object.equals()的来源)

另外,不要忘记equals()函数的契约:

equals 方法在非空对象引用上实现等价关系:

  • 它是自反的:对于任何非空引用值xx.equals(x)都应该返回 true。
  • 它是对称的:对于任何非空引用值xyx.equals(y)当且仅当y.equals(x)返回 true 时才应返回 true。
  • 它是可传递的:对于任何非空引用值xyz,如果x.equals(y)返回truey.equals(z)返回true,则x.equals(z)应该返回true
  • 它是一致的:对于任何非空引用值xy,多次调用x.equals(y)一致返回true或一致返回false,前提是没有修改对象上相等比较中使用的信息。
  • 对于任何非空引用值xx.equals(null)应该返回false

还推荐阅读:

于 2012-10-21T20:40:42.387 回答
9

equalsforObject比较内存引用。
这就是为什么它是错误的,因为它们是不同Object
equals,因为String被覆盖以基于字符进行比较。
您有 2 个空String对象,这就是equals返回的原因true

于 2012-10-21T20:41:10.910 回答
5

==比较对象/字符串/任何东西的地址

.equals()旨在使用对象的内部状态进行比较。

所以:

new Object() == new Object() => false- 内存中不同地址的两个独立对象。

new String("a") == new String("a") => false- 相同的情况 - 字符串对象的两个单独地址。

new String("a").equals(new String("a")) => true- 地址不同,但 Java 将采用一个对象状态 ('a') 并与其他对象状态 ('a') 进行比较,发现它们相等并报告为真。

使用 equals() 方法,您可以以任何适合您的程序的方式对比较进行编码。

intern()是一个有点不同的故事。它旨在为相同的字符序列返回相同的对象(地址)。当您多次构造相同的字符串时,减少所需的内存量很有用。

new String("aaa").intern()如果曾经有人创建过“aaa”字符串,将在机器内存中寻找,并将返回字符串的第一个实例......如果没有找到 - 当前的将被列为第一个和所有进一步的“aaa”。实习生() 和 newString("aaa").intern()并将("a"+"aa").intern()返回那个“第一个”实例。

当心:"aaa".intern()操作不是很快,如果您将实习所有字符串 - 您将节省一些内存,但会丢失相当多的 CPU 工作。

于 2012-10-21T21:09:20.080 回答
2

类中的equals实现Object只比较引用。这是源代码:

public boolean equals(Object obj) {
return (this == obj);
}
于 2012-10-21T20:42:11.930 回答
2

如果要使其以其他方式运行,则需要在类中重写 equals 方法。默认情况下,它检查两个引用是否引用同一个对象。

于 2012-10-21T20:45:40.777 回答
1

类的equals()MethodObject不知道如何比较字符串,它只知道如何比较对象。为了比较字符串,字符串类将覆盖equals()Method 并比较其中的字符串。

Object.equals()将仅比较引用,其中String.equals()将比较值。

于 2014-09-08T16:20:30.677 回答
0

有趣的是,不像Sting不会StringBuffer覆盖该equals()方法。它的功能与Object类相同。

于 2020-08-28T14:01:56.317 回答