等于和可比较集

Old*_*eon 10 java equals compareto comparable treeset

我在这里发布了一些代码,正确解决了海报的问题.OP希望删除重复项并将某些特殊项目放在列表顶部.我使用了TreeSet一个特殊的Comparable课程,它包含了Locale他们正在努力实现他们想要的东西.

然后我开始思考......正如你所做的那样...我通过0compareTo方法返回来消除重复,而不是trueequals实现返回,因为需要做的是正确地指示副本Set(从定义中)Set).

我不反对使用这种技术但是我使用的是什么可能被视为无证件的功能?我可以安全地假设继续这样做会继续发挥作用吗?

Tom*_*icz 19

似乎这在JavaDocTreeSet(大胆的矿)中有很好的记录:

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

以下是实现但与以下内容不一致的唯一(?)JDK类的示例:Comparableequals()

Set<BigDecimal> decimals = new HashSet<BigDecimal>();
decimals.add(new BigDecimal("42"));
decimals.add(new BigDecimal("42.0"));
decimals.add(new BigDecimal("42.00"));
System.out.println(decimals);
Run Code Online (Sandbox Code Playgroud)

decimals最后有三个值因为42,42.0并且42.00就所equals()涉及的而言并不相等.但是如果替换HashSetTreeSet,则结果集只包含1个项目(42- 恰好是第一个添加的项目),因为在使用时它们都被认为是相同的BigDecimal.compareTo().

这表明当使用不一致的类型时TreeSet,这种方式会" 破碎 " equals().它仍然可以正常工作,并且所有操作都是明确定义的 - 它只是不服从Set类的合同- 如果两个类不是equal(),它们不被认为是重复的.

也可以看看