Java 你能有多个hashcode和equals吗

Java 你能有多个hashcode和equals吗,java,Java,好的,我需要被指向正确的方向。我已经有了一个哈希代码和一个带有over-ride的equals方法 @Override public int hashCode() { return type.hashCode() ^ type2.hashCode() ^ type3.hashCode() ; } @Override public boolean equals(Object obj) { if (!(obj instanceof MyO

好的,我需要被指向正确的方向。我已经有了一个哈希代码和一个带有over-ride的equals方法

@Override 
public int hashCode() {         
    return  type.hashCode() ^ type2.hashCode() ^ type3.hashCode()  ;        } 

@Override 
public boolean equals(Object obj) { 
    if (!(obj instanceof MyObject)) {
        return false;
    }
    MyObject mdc = (MyObject) obj; 
    return mdc.type.equals(type) && mdc.type2.equals(type2) && mdc.type3.equals(type3); 
}
现在,如果我只想比较第一种和第二种,而不是第三种呢?我可以有两个hash和equal方法供以后使用吗

我想做的是,如果类型1和类型2匹配,从当前arraylist中删除它们,并将它们添加到新列表中,显示哪些是相同类型的。这与上面显示的哈希代码不同

在数组中是否有其他方法,我可以看到type1和type2的哪一个组合出现多次

例:

  • 射击光环
  • 射门呐喊
  • 赛马场
  • 射击光环
拍摄光环出现两次,它们需要被删除并添加到另一个列表中,但问题是我以前已经有了一个哈希代码


编辑:我想感谢大家的想法。我已经通过创建另一个具有类似getter和setter的对象类来解决了这个问题,但是使用了更新的哈希代码,并且它起到了作用。下次我将使用更好的逻辑方法。我在这篇文章中的主要目的是想知道是否有任何方法可以在一个类中包含多个hashcode和方法,而这显然是不可能的

在同一个类中不能有两个具有相同签名的方法,因此这是不可能的(这是java类/方法的常见原则,而不仅仅是
equals
hashcode
方法)


正如Dennis Meng所评论的,如果遇到这种情况,您需要重新思考您的设计

不能有两个具有相似签名的方法。无论您提到什么逻辑,您都可以将现有的equals方法放入一个类中并相应地返回结果,这是不可能的。您可以对类进行子类化,覆盖
hashCode()
equals(…)
,并在一种情况下使用一个类的实例,在另一种情况下使用另一个类的实例。但这整个场景看起来像是灾难的候选,所以重新考虑一下你是否真的需要它

如果您只想定义多个排序顺序,请使用外部
比较器
实例

现在,如果我只想比较第一种和第二种类型,而不是 第三个


在我看来,您的需求促使您创建不同的类来正确比较对象。因此,一个类知道它应该只比较type1和type2,而另一个类知道它应该比较所有3个(可能是对象的层次结构?)

在我看来,你真正的问题不是相等,hashcode的东西…它试图处理这样一种情况,即某个集合已经有一个你正试图放入第二个的东西,并试图用一个相等的hashcode的东西来检测它,它知道的不仅仅是两个被比较的对象。我想我是在“重新思考你的逻辑”这列火车上,我相信你正在尝试构建的集合更像是一个
地图
,而不是
集合
,我认为你目前正在挣扎

如果您试图将MyObject实例推入的数据结构是
映射
,那么MyObject equals/hashCode问题将完全消失,因为关于equals()和hashCode()的字符串的默认处理将正常工作

在你的例子中,结果是

[ "Shooting Halo", [ MyObject("Shooting Halo"), MyObject("Shooting Halo") ],
[ "Shooting CallofDuty", [ MyObject("Shooting CallofDuty") ],
[ "Racing Forza", [ MyObject("Racing Forza") ]

一旦构建了集合,就可以对其进行解析,并找出如何处理具有多个值的键。如果您走这条路,请查看GoogleGuava库中的多重映射,因为它使这个用例变得微不足道

我可能要补充一点,如果您发现自己在同一个类中有相同方法的两个不同实现,那么您需要重新考虑您的逻辑。作为一个旁注,对您的
hashCode
使用
^
这样的方法不是一个好主意,因为创建冲突非常简单(提示:XOR是可交换和关联的)你可以只有一个<代码>等于<代码>。为什么不执行由代码> >类型<代码>和<代码>类型2>代码>进行比较的逻辑?对于一个<代码>等于< <代码> >方法,这是没有意义的。我可以为ArayLIST创建什么样的逻辑,以便分别用Type和Type 2进行比较?正确答案,而不是发布和等待,可能永远,为一个可能不正确的答案?我如何选择我想比较3个类型一起,或只是两个?当我调用哈希代码方法,它怎么知道?是的,我正在使用比较器排序arrayList