首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HashSet问题--带有contains的equals和hashCode的工作方式与我预期的不同

HashSet问题--带有contains的equals和hashCode的工作方式与我预期的不同
EN

Stack Overflow用户
提问于 2008-10-23 17:16:39
回答 3查看 4.6K关注 0票数 3

我有以下代码:

代码语言:javascript
运行
复制
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)

输出为:1 1现在,HashSet为:1 1 0

但是,我希望最后一行也是true(1)。我是不是明显漏掉了什么。

(是的,我知道我的equals方法和hashcode方法没有考虑到一些问题……它们故意很简单,但一定要让我知道是不是那里的问题导致了这个问题。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-10-23 18:16:54

您不应该实现Java式的equals和hashCode方法,而应该实现Python的等价物__eq____hash__。添加

代码语言:javascript
运行
复制
def __hash__(self):
    return self.hashCode()
def __eq__(self, o):
    return self.equals(o)

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

现在,代码打印五个"1“。

票数 10
EN

Stack Overflow用户

发布于 2008-10-23 17:33:02

我用Java编写了等效的代码,它确实为所有三个contains()调用生成了true。所以我认为这一定是Jython中的一个奇怪之处。也许底层的Java对象与您在Python中看到的并不完全相同。

票数 1
EN

Stack Overflow用户

发布于 2008-10-23 22:18:49

我不知道Python,但看起来底层Java对象的equals()和hashcode()没有遵守所需的约定。

如果等于两个对象,

  • ()必须返回相同的哈希码()。

看起来这是违反的。HashSets首先将在查找中使用散列代码来获取匹配对象所在的列表,然后遍历该列表以找到相等的对象。如果您的hashcode没有遵守约定,并且它们返回不同的hashcode,那么即使它们是equals()可比较的,它也不会在hashset中找到它。

默认的Object.hashcode()不会为两个对象返回相同的哈希码。你必须覆盖它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/230585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档