gpt4 book ai didi

java - 尽管实现了 equals 和 hashcode 方法,Hashmap get 和 containskey 方法仍无法检索对象

转载 作者:行者123 更新时间:2023-12-02 09:05:45 25 4
gpt4 key购买 nike

我有一个名为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com