added equals, hashCode and toString