HashMap的get()方法

时间:2014-07-01 17:16:00

标签: java hashmap

我正在尝试使用密钥获取值。我正在使用get()方法。我的关键是一个用int和String组成的对象。所以我制作并反对

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

我收到了null。当我查看debbuging模式或打印keySet时,我收到了类似的内容

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

虽然我的密钥应该是

[1,"GM", 2,"SM", 3"PM"]

为什么密钥看起来像Keys@d9c6e2而不是2,"SM"?以及如何使用密钥2,"SM"获取值?

我在Keys中覆盖toString 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 个答案:

答案 0 :(得分:4)

您需要在Keys对象上覆盖toString方法。否则你将获得default toString provided by java.lang.Object

您可以实现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 + "\"";

您还需要override the equals and 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对象不相等。

答案 1 :(得分:1)

可以,因为你正在使用一个特殊的Keys对象作为哈希映射的关键 - 然后你需要正确地实现hashCode并在其他人已经解释过的那个Keys类上等于。 / p>

除非你有特殊的理由不这样做,否则你真的可以使用String作为哈希映射的关键。创建一些方法,如下所示:

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

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

使用自定义对象类可能会有一种“正确性”或“工程性”的肤浅气氛,但实际上,只使用字符串通常会表现得同样好,如果有任何东西甚至可以稍微节省内存。

答案 2 :(得分:0)

在Keys.java对象中覆盖 toString 方法。目前,它使用java.lang.Object#toString

中定义的方法