Java equals和compareTo不一致有意义吗?
我想使一个类在Java equals和compareTo不一致有意义吗?,java,collections,Java,Collections,我想使一个类在SortedSet|SortedMap中可用 class MyClass implements Comparable<MyClass>{ // the only thing relevant to comparisons: private final String name; //... } class MyClass实现了可比较的{ //唯一与比较相关的是: 私有最终字符串名; //... } 类的实例必须按其名称属性排序。 但是,我不希望将具有相同
SortedSet
|SortedMap
中可用
class MyClass implements Comparable<MyClass>{
// the only thing relevant to comparisons:
private final String name;
//...
}
class MyClass实现了可比较的{
//唯一与比较相关的是:
私有最终字符串名;
//...
}
类的实例必须按其名称属性排序。但是,我不希望将具有相同名称的实例视为相同的实例 因此,
SortedSet
内容看起来像a、a、a、b、c(通常,
SortedSet
只允许a、b、c)
首先:这(哲学上)是一致的吗?
如果是这样的话,我是否必须期待不可预测的行为,而我却没有
重写等于(…)
和hashCode()
编辑:对不起,我的问题似乎不一致:
我想在一个集合中放入多个“相等”值,这是不允许的 按概念。
所以,请不要再回答我的问题。
感谢所有已经回复的人。让我问你一个问题:让
a.compareTo(b)
返回0和a.equals(b)
返回false有意义吗
我会用一个字母来代替。这就是为什么我所知道的所有SortedMap
/SortedSet
实现都允许您在创建时传入比较器
。建议,如果您没有实现compareTo
与等于一致,您应该明确指出:
建议使用的语言为“注意:
这个类有一个自然的顺序
与平等不一致。”
只需将此代码放在equals方法中,不要再考虑它:
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof MyClass)) return false;
return 0 == this.compareTo((MyClass) obj);
}
从Javadoc获取可比较的
强烈建议(尽管不是
(必需)自然顺序为
与平等相一致。这是真的
因为排序集(和排序贴图)
没有显式的比较器
“奇怪地”当它们与
具有自然属性的元素(或键)
排序与相等不一致
如果希望compareTo与equals()不一致,建议您通过提供实现comparator的类来使用显式comparator
如果是这样,当我不重写equals(…)和hashcode()时,我是否必须预期不可预测的行为
您仍然应该重写equals()和hashcode()。equals()和hashcode()是否与compareTo一致是另一回事。我倾向于回答:这没有意义;)谢谢,我忘了有比较器;)但如果实现equals(),则还必须实现hashcode()。否则可能会发生奇怪的事情。您可以将哈希代码委托给其他属性或返回可比较int值的方法。但是不要麻烦了,因为hashCode就像是检查它是否是一个相同的引用,而不是它们是否有相同的值。为什么不使用不同的集合类型呢?是的,google Collection API的MultiSet | MultiMap似乎很适合这样做。我非常希望Sun、aehm、Oracle等公司有朝一日能为Java collection API添加功能。。。