在Java中使用带有String和Object的equals()方法

Tin*_*iny 7 java string equals

Object o1 = new Object();
Object o2 = new Object();
//o1=o2;
System.out.println(o1.equals(o2));
Run Code Online (Sandbox Code Playgroud)

它回来了false.true如果删除了注释,它可以返回.


为什么不适合String同班同学?

String s1=new String();
String s2=new String();
System.out.println(s1.equals(s2));
Run Code Online (Sandbox Code Playgroud)

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

ppe*_*rka 19

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

public boolean equals(Object 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;
}
Run Code Online (Sandbox Code Playgroud)

(链接到String.equals()的源代码)

对象相等:

类的equals方法Object实现了对象上最具辨别力的等价关系; 即,对于任何非空的参考值xy,当且仅当该方法返回true x,并y指代相同的对象(x == y具有值true).

/* Object.equals() */
public boolean equals(Object obj) {
    return (this == obj);
}
Run Code Online (Sandbox Code Playgroud)

(链接到Object.equals()的源代码)

另外,不要忘记equals()功能合同:

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

  • 它是自反的:对于任何非空引用值x,x.equals(x)应该返回true.
  • 它是对称的:对于任何非空引用值xy,x.equals(y)应真,当且仅当返回y.equals(x)返回true.
  • 它是传递性:对于任何非空的参考值x,y以及z,如果x.equals(y)回报率truey.equals(z)回报率true,那么x.equals(z)应该返回true.
  • 它是一致的:对于任何非空引用值xy,在多次调用x.equals(y)始终返回true或始终返回false,没有提供所用的信息等于在对象上比较被修改.
  • 对于任何非空引用值x,x.equals(null)应返回false.

还建议阅读:


Cra*_*lus 9

equals用于Object比较内存引用.
这就是为什么它是假的,因为它们是不同的Object小号
equalsString是重写的比较基础上的人物.
你有两个空String对象,这就是为什么equals返回true.


ya_*_*ser 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”.intern ()和新的String("aaa").intern()("a"+"aa").intern()将返回“第一”的实例。

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