- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个名为 Language
的类(class),语言有一堆字段,但我只想使用一个字段来将其与其他语言对象进行比较。该字段称为 languageCode
它是一个字符串。我使用Intellij Idea的方法生成工具自动实现了equals和hashcode。这是具有相关字段和生成方法的类。
public class Language implements Serializable{
private String languageCode
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Language language = (Language) o;
return languageCode.equals(language.getLanguageCode());
}
@Override
public int hashCode() {
return Objects.hash(languageCode);
}
}
还有一个类叫做 Journal
期刊也有一堆不同的字段,但只有一个相关,即:
public class Journal {
private Map<Language, String> titleTranslations = new HashMap<>()
}
在整个程序中我使用常量变量 ENGLISH_LANGUAGE
其中包含数据库中表示语言对象的英语。 titleTranslations
中的所有语言对象也来自同一个数据库表。此外,Journal 在其 Hashmap titleTranslations 中肯定有一个英语对象。
但是当我运行以下测试时:
journal.getTitleTranslations().forEach((Language language, String string) ->{
log.info(language.getLanguageCode() + " " + string);
log.info("hashcode is " + language.hashCode());
});
log.info("default language " + ENGLISH_LANGUAGE.getLanguageCode());
log.info("hashcode is " + ENGLISH_LANGUAGE.hashCode());
log.info("contains key " + journal.getTitleTranslations().containsKey(ENGLISH_LANGUAGE));
log.info("key is not null " + (journal.getTitleTranslations().get(ENGLISH_LANGUAGE) != null));
它给出以下输出:
de deutsch
hashcode is 3232
en english
hashcode is 3272
fr francais
hashcode is 3307
nl nederlands
hashcode is 3549
defautl language en
hashcode is 3272
contiains key false
key is not null false
你可以看到,尽管 ENGLISH_LANGUAGE 的哈希码和 titletranslations 中的英语语言对象完全相同(3272),但在使用 get 方法时仍然找不到 key ,并且当我使用 containsKey
时它返回 false并使用 ENGLISH_LANGUAGE 作为参数。
有人可以告诉我我做错了什么吗?单字段哈希码实现是否不起作用?
谢谢
最佳答案
好吧,问题似乎与框架有关。因为我使用的框架使用像 hibernate 这样的代理子类,所以 equals 方法应该稍微调整。当您选中选项 Accept subclasses as parameter to equals() method
时,intellij 可以自动为您执行此操作。复选框下方是这样的说明:
While generally incomplaint to Object.equals() specifiation accepting subclasses might be necessary for generated method to work correctly with frameworks, which generate Proxy subclasses like Hibernate
检查此项将创建一个使用此 if 语句的 equals 方法 if (!(o instanceof Language)) return false;
而不是这个if (o == null || getClass() != o.getClass()) return false;
.
这在某种程度上解决了问题。哈希码方法保持不变。完整代码如下:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Language)) return false;
Language language = (Language) o;
return getLanguageCode().equals(language.getLanguageCode());
}
@Override
public int hashCode() {
return Objects.hash(getLanguageCode());
}
关于java - 尽管实现了 equals 和 hashcode 方法,Hashmap get 和 containskey 方法仍无法检索对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59824447/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我有实体: @Entity @Table(name = "CARDS") public class Card { @ManyToOne @JoinColumn(name = "PERSON_I
我正在尝试计算二维多边形的表面法线。我正在使用 OpenGL wiki 中的 Newell 方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_S
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我这里有以下 XML: Visa, Mastercard, , , , 0, Discover, American Express siteonly, Buyer Pay
即将发生的 Google 政策变更迫使我们实现一个对话框,以通知欧盟用户有关 Cookie/设备标识符用于广告和分析的情况。我只想向欧盟用户显示此对话框。我不想使用额外的权限(例如 android.p
本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技
我有一个与酒精相关的网站,需要先验证年龄,然后才能让他们进入该网站。我使用 HttpModule 来执行此操作,该模块检查 cookie,如果未设置,我会将它们重定向到验证页面。我验证他们的年龄并存储
在欧盟,我们有一项法律,要求网页请求存储 cookie 的许可。我们大多数人都了解 cookie 并同意它们,但仍然被迫在任何地方明确接受它们。所以我计划编写这个附加组件(ff & chrome),它
以下在 C 和/或 C++ 中是否合法? void fn(); inline void fn() { /*Do something here*/ } 让我担心的是,第一个声明看起来暗示函数将被定义
我是一名优秀的程序员,十分优秀!