对象等于方法==和浅表副本

时间:2018-12-07 18:25:36

标签: java

我有

Object o = new Object()
o == o.clone(); //I understand this should be false since it's different two arraylist pointing to the same object right?
o.equals(o.clone())  //it's true if it's shallow copy since pointing at the same one

这里equals不是==,它应该在比较哈希码吗?因为它是对象 来源:equals method usage in string and list

但在我的笔记上说,这里的equal方法表示==。

我的笔记错了吗?

我的笔记说该对象类具有aclone()方法,但其实现为空, 并且由于这个原因,不允许对象类的对象调用此方法。

有人可以解释一下这个更好的方法吗?我想我误会了

2 个答案:

答案 0 :(得分:1)

==比较对象引用-它们是否是完全相同的内存引用。 equals是每个类实现的方法,通常用于进行更有用的比较(例如,如果两个字符串包含相同的字符,或者两个列表包含相同的内容)。

但是,Object中的默认实现只是回退到进行==比较,因此对于该类的实例而言,没有什么区别。

答案 1 :(得分:0)

  • ==在对象引用的上下文中检查对象身份

    Foo f1 = new Foo();
    Foo f2 = f1; // Both f1 and f2 refer to the same object.
    // f1 == f2 returns true
    Foo f3 = new Foo(); // A second instance of Foo is created
    // f1 == f3 returns false
    

    仅在原始数据类型(booleanbyteshortintlongchar,{{ 1}}和floatdouble检查值。 1

  • ==方法仅是使对象能够将自己与其他对象进行比较的方法。 equals的文档对程序员应如何实现该方法提出了要求,但从技术上讲,程序员可以做他想做的任何事情。

    equals的实现只是Object.equals(Object)

  • return this == obj)方法永远不要依赖或调用equals ,因为根据hashCode()被认为不相等的两个对象可能会具有相同的哈希码。 equals的唯一要求是相反的方式:它必须为通过hashCode方法被认为相等的所有对象返回相同的哈希码。


1 正如安德烈亚斯(Andreas)在评论中已经提到的那样–从技术上讲equals总是检查值。这也适用于对象引用,因为对象引用本身就是值。