当前位置: 首页 > 知识库问答 >
问题:

get()使用继承的hashCode()方法可以正常工作,使用用户定义的hashCode()方法不能识别键

匡凌
2023-03-14
public int getTeamOfPlayer(Player p)
{    
    return teamOfPlayer.get(p);
}
public int getTeamOfPlayer(Player p)
{
    Object[] o = teamOfPlayer.keySet().toArray();
    Player p2 = (Player) o[0];

    System.out.println("getTeamOfPlayer(" + p + ")"
        + "\n\thash of argument is " + p.hashCode()
        + "\n\tkeySet() of hashmap is " + teamOfPlayer.keySet() 
        + "\n\tcontainsKey() of hashmap is " + teamOfPlayer.containsKey(p) 
        + "\n\tplayer extracted from keySet() is " + p2 
        + "\n\tplayer extracted from keySet() has hash of" + p2.hashCode() 
        + "\n\targument.equals(key) returns " + p.equals(p2) 
        + "\n\tkey.equals(argument) returns " + p2.equals(p));

    int i = teamOfPlayer.get(p);
    return i;
}
getTeamOfPlayer(main.data.entities.Player@89f632df)
    hash of argument is -1980353825
    keySet() of hashmap is [main.data.entities.Player@89f632df]
    containsKey() of hashmap is false
    player extracted from keySet() is main.data.entities.Player@89f632df
    player extracted from keySet() has hash of-1980353825
    argument.equals(key) returns true
    key.equals(argument) returns true

--

更新:下面是equals()和hashCode()方法。

@Override
public boolean equals(Object obj)
{
    if (this == obj)
        return true;

    Player player;

    if (obj != null && obj instanceof Player)
        player = (Player) obj;
    else
        return false;

    if (status != player.status || !name.equals(player.name) || race != player.race || weeksOut != player.weeksOut || injuryType != player.injuryType
        || XP != player.XP)
        return false;

    for (int i = 0; i < 8; i++)
    {
        if (attributes[i] != player.attributes[i])
            return false;

        if (injuries[i] != player.injuries[i])
            return false;
    }

    for (int i = 0; i < 28; i++)
    {
        if (hasSkill[i] != player.hasSkill[i])
            return false;
    }

    for (int i = 0; i < 4; i++)
    {
        if (equipment[i] != player.equipment[i])
            return false;
    }

    return true;
}

@Override
public int hashCode()
{
    int hash = 11;

    hash = 31 * hash + status;
    hash = 31 * hash + name.hashCode();
    hash = 31 * hash + race;
    hash = 31 * hash + weeksOut;
    hash = 31 * hash + injuryType;
    hash = 31 * hash + XP;

    for (int i = 0; i < 8; i++)
    {
        hash = 31 * hash + attributes[i];
        hash = 31 * hash + injuries[i];
    }

    for (int i = 0; i < 28; i++)
        hash = hash + (hasSkill[i] ? 1 : 0);

    for (int i = 0; i < 4; i++)
        hash = 31 * hash + equipment[i];

    return hash;
}

共有1个答案

邹修真
2023-03-14

这两个答案都是对的。更具体地说

get(p)返回null(可能是因为equals()和hashcode()不同步),然后getTeamOfPlayer()试图将null转换为int。

如果该方法返回Integer而不是int,您就不会有这个问题,或者如果您将其编码为

public int getTeamOfPlayer(Player p)
{    
    Integer t = teamOfPlayer.get(p);
    if (t == null) {
        return -1;
    } 
    return t;
}
 类似资料:
  • 问题内容: 改善这个问题 来自链接: http://www.tutorialspoint.com/java/java_string_hashcode.htm Java中的hashCode和equals方法之间的关系 好的hashCode()实现 但是我不了解哈希码。 这是一个例子: 这个简单的程序给我输出: 谁能告诉我:它是如何给我的输出:? 问题答案: 字符串的 哈希码 计算如下: 使用算术,其

  • 我正在准备Java认证,显然我不能正确回答这个答案。 给定: 它在第11行独立插入,为Chilis实现equals()和hashCode()契约?(选择所有适用内容。) A。public int hashCode(){return 7;} B。public int hashCode(){return hotness;} C。public int hashCode(){return color.le

  • 您好,当我想在不更改hashCode()方法的情况下拥有一个自定义HashSet时,有人可以为我指出正确的方向。用法是拥有一组必须具有不同的一个(或多个)属性的对象。 例如,对于这个类: 我希望有UserNameSet,它只允许包含具有不同名称的用户。我不想覆盖User中的hashCode和equals方法,因为我仍然想区分同名但不同电子邮件的用户。 我想为这一个HashMap重写hashCode

  • 这是来自与hashCode一起使用的旧版本代码并等于,但我正在尝试让新版本使用它。我认为原因是因为在旧版本中我覆盖了 equals 和 hashCode,但在新版本中我似乎无法做到这一点,因为我不再比较对象,而是比较数组(这是猜测)。因此,当前版本不会拾取重复项。它说没有重复项,但这是不正确的。 以下是检测重复项的旧版本的哈希代码和等于。 这是当前版本。 在搜索方法中是确定重复项的地方。这是旧的代

  • 问题内容: 我很好奇java如何通过使用Object API的hashCode()方法生成哈希值? 问题答案: Java不会生成hashCode(),即此处没有自动发生的情况。但是,根据对象实例的内存地址生成HashCode。大多数类(尤其是如果要在任何API中使用它的类)都应该实现自己的HashCode(并通过契约使用自己的equals方法)。

  • 本文向大家介绍java中hashCode、equals的使用方法教程,包括了java中hashCode、equals的使用方法教程的使用技巧和注意事项,需要的朋友参考一下 前言 众所周知Java.lang.Object 有一个hashCode()和一个equals()方法,这两个方法在软件设计中扮演着举足轻重的角色。在一些类中重写这两个方法以完成某些重要功能。 1、为什么要用 hashCode()