【发布时间】:2016-06-20 14:50:00
【问题描述】:
当我查看Java Object Ordering 教程时,文章的最后一节'比较器'让我有点困惑。
通过定义一个类Employee,它本身可以通过员工的姓名进行比较,本教程不会显示该类是否覆盖了equals 方法。然后它使用自定义的Comparator,其中员工按资历排序,以对员工列表进行排序,我可以理解。
然后教程解释了为什么这对于诸如TreeSet(SortedSet)这样的排序集合不起作用,原因是:
它会生成一个与 equals 不兼容的排序。这意味着此 Comparator 等同于 equals 方法不等同的对象。特别是,在同一日期雇用的任何两名员工都将进行比较。当您对列表进行排序时,这无关紧要;但是当您使用 Comparator 来订购排序的集合时,这是致命的。如果您使用此比较器将同一日期雇用的多个员工插入 TreeSet,则只会将第一个添加到集合中;第二个将被视为重复元素并被忽略。
现在我很困惑,因为我知道 List 允许重复元素,而 Set 不基于 equals 方法。所以我想知道当教程说Comparator生成的排序与equals不兼容时,这是什么意思?它还说'如果您使用此比较器将同一日期雇用的多个员工插入 TreeSet,则只会将第一个添加到集合中;第二个将被视为重复元素并将被忽略。我不明白使用Comparator 将如何影响原始equals 方法的使用。我想我的问题是TreeSet 在这种情况下将如何生成和排序,以及何时使用compare 和equals 方法。
【问题讨论】:
标签: java collections treeset