added more hashCode() and equals()