An object is characterized by its identity (location in memory) and state (actual data). While the '==' operator compares only the identities of two objects (to check if both the references are actually the same object), the equals
method defined in java.lang.Object
can compare the state as well, when customized by overriding it. The equals
method only applies to Objects, not primitives. Also, immutable objects do not need to override equals.
The general usage contract for equals()
has been put forth verbatim from the Java specification:
...
Code Block | ||
---|---|---|
| ||
public class Card { private final int number; public Card(int number) { this.number = number; } public boolean equals(Object o) { if (!(o instanceof Card)) return false; Card c = (Card)o; return c.number == number; } } class XCard extends Card { private String type; private Card card; public XCard(int number, String type) { super(number); this.type = type; } public Card viewCard() { return card; } public boolean equals(Object o) { if (!(o instanceof XCard)) return false; XCard cp = (XCard)o; return cp.card.equals(card) && cp.type.equals(type); } public static void main(String[] args) { XCard p1 = new XCard(1, "type1"); Card p2 = new Card(1); XCard p3 = new XCard(1, "type2"); System.out.println(p1.equals(p2)); //returns false System.out.println(p2.equals(p3)); //returns false System.out.println(p1.equals(p3)); //returns false } } |
...
Risk Assessment
Violating the general contract when overriding the equals()
method can lead to unexpected results.
...