The main problem with not overriding both is that a lot of containers assume that both methods use the same strategy.
The typical cases are HashMaps, if you override one of equals()/hashCode() but not both (or override them inconsistently) , they will probably not work, because they use hashCode() to find the bucket your key should be, bu then use equals() to search inside that bucket. So it may end up searching for the given key in the wrong bucket!. Incidentally, this is why sometimes you don't find a key when get()ting it, but can find it by iterating over each element: iterating does not use hadhCode().
It is a similar reasoning as why you should never have a hashCode() that changes its value while the object is inside a HashSet/HashMap: by the time you search for your object, hashCode() might have changed and send you to an incorrect bucket.