Какова причина принятия решения о включении этих методов в java.lang.Object? Равенство и хеширование не имеют смысла для многих классов.
Логичнее было бы сделать два интерфейса:
interface Equalable {
boolean equals(Equalable other);
}
interface Hashable extends Equalable {
int hashCode();
}
Например, определение HashSet может выглядеть как
class HashSet<T extends Hashable> ...
Это предотвратило бы одну из общих ошибок начинающих - использование набора элементов без реализации equals/hashCode.