Is there a particular reason you implemented hashCode but not equals? It looks safe according to the contract, I'm just curious.