In my test, two instance of EntityTarget of the same player will have different hashcode and the two instance do not be equal, mainly because of the implement of the equal() method of Location.
By removing the check about loc in method hashcode() & equal(Object), the mechanic looks running correctly.
Sorry for my bad english, since it is not my mother language.