热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

虽然哈希值不同,但为什么我的对象存储在同一个位置?

如何解决《虽然哈希值不同,但为什么我的对象存储在同一个位置?》经验,为你挑选了1个好方法。

我有一个Movie类,我只覆盖hashCode()方法.请在下面找到java类

public class Movie {

private String actor;
private String name;
private String releaseYr;

public String getActor() {
    return actor;
}

public void setActor(String actor) {
    this.actor = actor;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getReleaseYr() {
    return releaseYr;
}

public void setReleaseYr(String releaseYr) {
    this.releaseYr = releaseYr;
}
@Override
    public int hashCode() {
        return actor.hashCode() + name.hashCode() + releaseYr.hashCode();
    }


}

我创建了两个Movie对象,并且对象的所有属性值都相同并将它们放在一个对象中HashMap.下面是代码

import java.util.HashMap;

public class Test {

public static void main(String[] args) {

    Movie m1 = new Movie();
    m1.setActor("Akshay");
    m1.setName("Taskvir");
    m1.setReleaseYr("2010");

    Movie m2 = new Movie();
    m2.setActor("Akshay");
    m2.setName("Taskvir");
    m2.setReleaseYr("2010");


    HashMap map = new HashMap();

    map.put(m1, "Value of m1");
    map.put(m2, "Value of m2");

}

}

我得到了预期的结果.正如我只重写hashcode()方法和两个对象的哈希值是相同的,所以它们被存储在相同的索引位置的HashMap表阵列的.以下是调试模式下的预期结果.

在此输入图像描述

但是如果我不覆盖hashCode()方法但是覆盖equals()方法,它们将存储在HashMap表数组的相同索引位置.虽然我可以看到哈希值不同.以下是我的等于方法

@Override
public boolean equals(Object obj) {

    Movie m1 = (Movie) obj;
    boolean result = false;

    if (m1.getActor().equals(this.actor) && m1.getName().equals(this.name)
            && m1.getReleaseYr().equals(this.releaseYr)) {
        result = true;
    }

    return result;
}

调试模式下的输出

在此输入图像描述

如果我不重写equals和hashCode方法,那么我也得到相同的意外结果.

按我的理解,如果我不重写equalshashCode方法,或仅重写equals方法则m1m2对象应存储在不同的位置哈希值是不同的m1m2对象.但在这种情况下,它没有发生.

有人可以解释一下为什么使用不同的哈希值,我的对象存储在同一个位置?

我使用过Java 8.



1> Mureinik..:

散列码具有巨大的范围,从Integer.MIN_VALUEInteger.MAX_VALUE,而HashMap通常具有少得多的存储桶(默认情况下,16条提出的新实例化的HashMap,至少与OpenJDK的11).因此,完全可能,甚至预期,哈希码将发生冲突,并且多个对象将被添加到同一个桶中.但请注意,如果您没有覆盖hashCode()此行为,则完全是偶然的,并且无法依赖.


推荐阅读
author-avatar
LYJ189_163
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有