There might be a problem if you modify you mutable object used as key. map.containsKey(modifiedKey) might return false even if key is there, You'll have to iterate over keys to find it.
So try to use immutable or don't modify mutable while it is a key.
Immutable object never changes. There are methods that look like they're changing the object but instead a new copy is created. Example:
String a = "A";
String b = a.substring(0); // substring created a copy of "A" with a not being modified at all.
a = a + b; // a+b create a new String "AA" with no modification of previous ones.
This might help caching-hashes-in-java-collections also this is great why-are-immutable-objects-in-hashmaps-so-effective
String has already implementation of equals and hashcode, no need to invent another class to use instead of it unless you're absolutely sure you need it.
As mention in point 1. you can do that but you'll have to be careful and not modify your mutable objects. That's not a very good practice though.