ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-17 07:03:38  阅读:179  来源: 互联网

标签:java collections hashset jython


我有以下代码:

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

但是,我原本期望最后一行也是真的(1).有什么明显的东西让我失踪.

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

解决方法:

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

def __hash__(self):
    return self.hashCode()
def __eq__(self, o):
    return self.equals(o)

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

现在代码打印五个“1”.

标签:java,collections,hashset,jython
来源: https://codeday.me/bug/20190717/1485851.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有