Well, the simplest answer: because the Javadoc for Object.hashCode() says:
If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
If you override either equals() or hashCode(), then in general, this requirement will no longer be met by the default implementation of the other method. Therefore other code that depends on this behavior -- in particular, HashMaps and the like -- will break.
Josh Bloch has a whole section on this in his Effective Java, which is an essential book to have.