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添加功能。。。