HashSet问题 - equals和hashCode包含的工作方式与我预期的不同

jsi*_*ght 3 java collections jython hashset

我有以下代码:

class IncidentTag:
     def __init__(self,tag):
        self.tag = tag
     def equals(self,obj):
        return self.tag.equals(obj.tag)
     def hashCode(self):
        return self.tag.hashCode()

from java.lang import String
from java.util import HashMap
from java.util import HashSet

tag1 = IncidentTag(String("email"))
tag1copy = IncidentTag(String("email"))
tag2 = IncidentTag(String("notemail"))

print tag1.equals(tag1copy)
print tag2.equals(tag2)

print "Now with HashSet:"

hSet = HashSet()
hSet.add(tag1)
hSet.add(tag2)

print hSet.contains(tag1)
print hSet.contains(tag2)
print hSet.contains(tag1copy)
Run Code Online (Sandbox Code Playgroud)

输出为:1 1现在使用HashSet:1 1 0

但是,我原本期望最后一行也是真的(1).是否有一些我不知道的明显事物.

(是的,我知道我的equals方法和hashcode方法没有考虑到一些问题...它们是故意简单的,但如果问题导致这个问题,请告诉我)

dme*_*ter 10

您不应该实现Java样式的equals和hashCode方法,而是实现Python等效项__eq____hash__.添加

def __hash__(self):
    return self.hashCode()
def __eq__(self, o):
    return self.equals(o)
Run Code Online (Sandbox Code Playgroud)

帮助.这些python方法 - 据我所知 - 通过Jython动态绑定到hashCode和equals().这确保您可以将Python类放入Java的集合中.

现在代码打印五个"1".