Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hashmap get和containskey方法无法检索对象,尽管已实现equals和hashcode方法_Java_Hashmap_Equals_Hashcode - Fatal编程技术网

Java Hashmap get和containskey方法无法检索对象,尽管已实现equals和hashcode方法

Java Hashmap get和containskey方法无法检索对象,尽管已实现equals和hashcode方法,java,hashmap,equals,hashcode,Java,Hashmap,Equals,Hashcode,我有一个名为Language的类,Language有一系列字段,但我只想使用一个字段,以便能够将它与其他语言对象进行比较。该字段称为languageCode,它是一个字符串。我已经使用Intellij Idea的方法生成工具自动实现了equals和hashcode。下面是具有相关字段和生成的方法的类 public class Language implements Serializable{ private String languageCode @Override

我有一个名为
Language
的类,Language有一系列字段,但我只想使用一个字段,以便能够将它与其他语言对象进行比较。该字段称为
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
Journal的类也有一系列不同的字段,但只有一个字段是相关的,即:

public class Journal {

  private Map<Language, String> titleTranslations = new HashMap<>()

}
它给出以下输出:

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的hashcodes和TitletTranslations中的ENGLISH LANGUAGE对象完全相同(3272),但在使用get方法时仍然找不到键,并且在使用
containsKey
并使用ENGLISH_LANGUAGE作为参数时返回false

有人能告诉我我做错了什么吗?单字段hashcode实现不知何故不起作用吗


谢谢

好的,问题似乎与框架有关。因为我使用的框架使用了hibernate之类的代理子类,所以应该稍微调整equals方法。这是intellij可以自动为您做的事情,当您选中复选框下方的选项
Accept subclass as parameter to equals()method
时,该复选框是这样解释的:

而对于Object.equals()说明符通常是不可理解的 子类可能是生成的方法正常工作所必需的 使用框架生成代理子类,如Hibernate

选中此项将创建一个equals方法,该方法使用此if语句
if(!(o instanceof Language))返回false而不是这个

这在某种程度上解决了问题。hashcode方法保持不变。以下是完整的代码:

@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());
}

演示如何初始化地图和
英语\u LANGUAGE
。除非这两个对象是来自不同母亲的兄弟,即它们所属的班级,否则这应该可以工作。我想我已经找到了问题的原因。它与框架有关。我将在几分钟后解释,并在回复帖子中添加一个解释。问题在于Hibernate在这里详细描述了该问题:,并使用有效的Java。
@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());
}