对集合使用hashCode()和equals()的多个替代

and*_*per 5 java equals set hashcode

假设我有一个简单的POJO类Class1,它有两个int类型的字段.

我已经实现了它的hashCode()和equals()方法来处理这两个字段,以便将类的实例放入一个集合中.

到现在为止还挺好.

现在,我希望有一个不同的集合,如果第一个字段相等,则认为Class1的实例相等,使得相等条件变弱.我甚至可能想要另一组只考虑第二个字段作为检查相等性的字段.

可能吗?如果是这样,怎么样?

Joa*_*uer 5

可以通过使用TreeSet提供Comparator仅检查您感兴趣的字段的自定义获得该效果.

但请注意,严格来说,这样TreeSet不再是"正确的",Set因为它实际上忽略了equal()对象的方法:

请注意,如果要正确实现接口,则由集合维护的排序(无论是否提供显式比较器)必须与equals一致Set.(参见ComparableComparator了解与equals一致的精确定义.)这是因为Set接口是根据equals操作定义的,但TreeSet实例使用其compareTo(或compare)方法执行所有元素比较,因此两个被认为相等的元素从集合的角度来看,方法是相等的.集合的行为即使其排序与equals不一致也是明确定义的; 它只是不遵守Set界面的一般合同.