在Java中使用了equals()方法的字符串和对象(Using the equals() meth

2019-08-01 17:38发布

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

它返回false 。 它可以返回true ,如果注释被删除。


为什么不是适用于同样的事情String类?

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

它返回true 。 为什么? (因为String使用实习生或别的参与?)

Answer 1:

由于equals()方法用于字符串的内容,而不是对象本身进行比较。

公共布尔等于(object对象)

比较此字符串与指定的对象。 当且仅当该参数不是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() )

对战平等的对象

对于类的equals方法Object实现对象上差别可能性最大的相等关系; 也就是说,对于任何非空引用值xy ,这种方法当且仅当返回true xy指代相同的对象( x == y的值为true )。

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

(链接的源的Object.Equals() )

另外,不要忘了合同equals()函数:

equals方法实现对非空对象引用的一个等价关系:

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

同时推荐阅读:

  • 是Object.hashCode()
  • 有效的Java(布洛克)


Answer 2:

equalsObject进行比较的内存引用。
这就是为什么它是假的,因为它们是不同的Object小号
equalsString被覆盖比较基础上的人物。
你有2个空String ,这就是为什么对象equals返回true



Answer 3:

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

.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工作。



Answer 4:

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

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


Answer 5:

equals方法需要在类中被重写,如果你想让它在一些其他的方式表现。 默认情况下,它会检查两个引用是否指向同一个对象。



Answer 6:

equals()的方法Object类不知道如何比较字符串,它只知道如何比较的对象。 对于比较字符串,字符串类将重写equals()方法和它比较字符串。

Object.equals()将只比较基准,其中String.equals()将比较值。



文章来源: Using the equals() method with String and Object in Java