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

HashMap的get()方法

章光华
2023-03-14

我试图用这个键得到一个值。我正在使用get()方法。我的密钥是由int和String组成的对象。所以我提出反对

HashMap<Keys,String> test = readFile(fileName2);
Keys myKey = new Keys(2,"SM");
test.get(myKey);

我收到了空的。当我查看去bug模式或打印密钥集时,我收到类似的消息

[Keys@d9c6e2, Keys@10285d8, Keys@c3dd7e]

虽然我的钥匙应该是

[1,“GM”,2,“SM”,3“PM”]

为什么键看起来像这样Keys@d9c6e2而不是2,“SM”以及如何使用键2,“SM”获取值?

我在键中覆盖了字符串methid。它看起来更好,但我仍然有空值,我相信有一些价值。

    Keys myKey = new Keys(2,"GL-G--T");
    System.out.println(myKey.toString());
    System.out.println(test.get(myKey.toString()));
    Set keyset = test.keySet();
    System.out.println(keyset);


    2,GL-G--T
    null
    [3,PNSN--G, 2,GL-G--T, 1,SM]

共有3个答案

胡嘉歆
2023-03-14

在你的钥匙里。java对象重写toString方法。目前它正在使用java中定义的方法。lang.Object#toString

桓高澹
2023-03-14

您可以使用一个特殊的Keys对象作为hash映射的键,然后只需要正确地在Keys类上实现hashCode和equals,正如其他人所解释的那样。

但是,除非您有特定的理由不这样做,否则您实际上可以使用字符串作为哈希映射的键。创建一些方法,例如以下方法:

private static String getHashMapKeyFor(int intKey, String stringKey) {
  return stringKey + "|" + intKey;
}

并将哈希映射声明为将String作为键类型。然后,每当您想在哈希映射中放置/查找值时,首先调用上述方法以获取要用于哈希映射的实际密钥。

使用自定义对象类可能表面上有一种“正确性”或“工程性”的感觉,但实际上,仅仅使用字符串通常会表现得同样好,甚至可能会稍微节省内存。

凌黎明
2023-03-14

您需要重写Keys对象上的toString方法。否则,您将获得java.lang.对象提供的默认toString。

您可以实现如下所示的toString方法:

public class Keys {
    private final Integer i;
    private final String s;

    public Keys(Integer i, String s) {
        this.i = i;
        this.s = s;
    }

    @Override 
    public String toString() {
        return i + "," + s;
    }
}

如果希望显示报价,则需要提供以下内容:

return i + ",\"" + s + "\"";

您还需要覆盖此对象的equals和hashCode以用作映射中的键:

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Keys)) {
            return false;
        }
        Keys other = (Keys)o;
        return other.s.equals(s) && other.i.equals(i);
    }

    @Override
    public int hashCode() {
        return toString().hashCode();
    }

如果不重写equals和hashcode,则映射将使用默认实现,这将导致具有相同值的两个Keys对象不相等。

 类似资料:
  • 在并发情景下,如果只用HashMap的get方法(不用put),因为我的Map是放配置数据的,启动完成后里面的数据不会改变,线程是否安全?

  • 问题内容: 我正在使用a ,但是在发生碰撞时该方法的工作原理还没有得到一个直接的答案。 假设对象放置在相同的 键中 。它们存储在吗?它们是否被覆盖,以便仅存在该键中的最后一个对象存在?他们在使用其他碰撞方法吗? 如果将它们放在中,是否可以检索整个列表?如果不是,是否有其他 Java 内置地图可以在其中执行? 就我的目的而言,单独的链接将是理想的,就好像有冲突一样,我需要能够浏览列表并获取有关列表中

  • 因此,我有一个游戏,在玩家登录后,我将玩家对象放入一个数组,在速度方面,我没有太多问题,因为我也存储了玩家的数组索引,但在某些系统中,我确实遇到了问题,速度方面。 例如,一个玩家想要“通知”另一个玩家,客户端发送一个包含该玩家姓名的数据包,就像一个唯一的长值一样,然后循环遍历整个玩家列表数组,比较姓名的长值,然后将其发送给找到的玩家。 我的想法是创建一个HashMap,它使用长值作为键来保证o(1

  • 问题内容: 谁能详细解释这种方法,谢谢。 问题答案: 设计通用哈希码的问题之一是,您将所有这些工作都放在了确保良好的位扩展上,然后有人来使用并以完全撤消的方式使用它。 让我们以一个带有X和Y(均为整数)的坐标类的经典示例为例。 这是一个经典的示例,因为人们会用它来证明这不是一个很好的哈希码,因为通常会有多个对象,其中(所有哈希都为0)或X和Y为Y和X的对象其他(将散列相同)和其他情况下,我们最终得

  • 查询单条数据使用Get方法,在调用Get方法时需要传入一个对应结构体的指针,同时结构体中的非空field自动成为查询的条件和前面的方法条件组合在一起查询。 如: 1) 根据Id来获得单条数据: user := new(User) has, err := engine.Id(id).Get(user) // 复合主键的获取方法 // has, errr := engine.Id(xorm.PK

  • 问题内容: 当使用方法将一个键实例说“ key”而一个Value实例说“ value”时,该类在内部做了什么。当我们说时,它如何取回值? 编辑 :我在这里不需要细节,基本上是想了解更大的图景以及方法和操作中的作用。 问题答案: 如果您谈谈更高的画面就如同below.Here我指项目作为中 同时放置物品。 计算密钥 如果与存在,则使用该密钥的方法查询的密钥I的篮子,以确定该元件将被添加或替换。 如果