比较器最佳实践

Jim*_*Jim 5 java collections comparator

如果我实现一个自定义比较器,equals除此之外还考虑好的做法compare
另外还有一个明确的合同Comparator吗?

ass*_*ias 4

Comparator 的契约在其 javadoc 中定义。尤其:

当使用能够施加与 equals 不一致的排序的比较器来对排序集(或排序映射)进行排序时,应小心谨慎。假设带有显式比较器 c 的排序集(或排序映射)与从集合 S 中提取的元素(或键)一起使用。如果 c 对 S 施加的排序与 equals 不一致,则排序集(或排序映射)将行为“奇怪”。特别是,排序集(或排序映射)将违反集合(或映射)的一般契约,该契约是根据 equals 定义的。

通常,如果两个对象从一个角度来看相等equals,但从另一个compareTo角度来看不相等,则可以将这两个对象作为键存储在 TreeMap 中。这可能会导致不直观的行为。也可以在特定情况下有目的地进行。

例如,此答案显示了一个示例,其中希望 equals 和 CompareTo 不一致