added hashCode and equals