Java:当ConcurrentSkipListSet的Comparator(a,b)== 0时会发生什么?

时间:2011-12-15 19:58:20

标签: java sorting concurrency comparator

我正在使用java.util.concurrent.ConcurrentSkipListSet。我定义了一个类People,其对象保存在ConcurrentSkipListSet<People>Comparator<People>比较Age People,并构造ConcurrentSkipListSet<People>个对象通过这个Comparator<People>

如果我有两个具有相同People的{​​{1}}个对象,例如Age,会发生什么? a.Age.equals(b.Age)中的ab都是?或者只有一个?

这样的ConcurrentSkipListSet必须与equals 一致,但就我而言, Comparator 绝对不是 > a.Age.equals(b.Age) 的。我只想按a.equals(b)People个对象进行排序。

现在我的比较器实现如下:

Age

如果我没有定义 class ComparatorHSD implements Comparator<People> { public int compare(People s0, People s1) { int rv = 0; if (s0.Age > s1.Age) { rv = 1; } else if (s0.Age < s1.Age) rv = -1; return rv; } ,那么该程序似乎停留在某处并且不会终止。所以我定义了它?为什么呢?

2 个答案:

答案 0 :(得分:2)

与equals一致只是意味着a.equals(b)(不是== ...)意味着a.compareTo(b) == 0。就是这样。

就排序而言,这意味着您在一个相等的值范围内有一个未定义的顺序。

我还应该注意到,根据java.util.Comparator的javadoc,

  

通常情况如此,但并非严格要求(compare(x,y)== 0)==(x.equals(y))。

虽然通常可以假设情况属实,除非另有说明。 (你对这个假设有多大的商业风险取决于你。)

答案 1 :(得分:0)

我认为这是一个没有实际意义的点,因为您无法将Comparator<Age>ConcurrentSkipListSet<People>一起使用。请参阅javadoc,其中显示Age必须是People的超类型,我想它不是。