How default .equals and .hashCode will work for my classes?

Say I have my own class

public class MyObj { /* ... */ }

It has some attributes and methods. It DOES NOT implement equals, DOES NOT implement hashCode.

Once we call equals and hashCode, what are the default implementations? From Object class? And what are they? How the default equals will work? How the default hashCode will work and what will return? == will just check if they reference to the same object, so it's easy, but what about equals() and hashCode() methods?


Yes, the default implementation is Object's (generally speaking; if you inherit from a class that redefined equals and/or hashCode, then you'll use that implementation instead).

From the documentation:

equals

The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).

hashCode

As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)


From Object in one of the JVM implementations:

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

public int hashCode() {
    return VMMemoryManager.getIdentityHashCode(this);
}

In both cases it's just comparing the memory addresses of the objects in question.


There are default implementations of equals() and hashCode() in Object. If you don't provide your own implementation, those will be used. For equals() , this means an == comparison: the objects will only be equal if they are exactly the same object. For hashCode() , the Javadoc has a good explanation.

For more information, see Effective Java, Chapter 3 (pdf), item 8.

链接地址: http://www.djcxy.com/p/71626.html

上一篇: 基于对象类的哈希码实现

下一篇: 默认的.equals和.hashCode如何为我的类工作?