有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在我的例子中,重写hashcode()和equals()的java HashMap不起作用

这是我第一次发布这个问题

请帮我解决我的问题。 在这段代码中,我使用HasMap存储键值对,这里的键是字符串,有三个子字符串,由“”空格分隔符分隔

比如说,

String t1 = new String("A B C");
and stored in HashMap as-

m.put(t1,27);

这里,A、B和C是三个不同的字符串。其中,假设A、B、C的不同组合是唯一的

Like "A B C", "B A C", "C B A" are all treated as equal.

我为此实现了hashCode()和equal(), 下面的代码只能打印

A B C:61046662

但它甚至没有调用hashCode()或equals()。请给我一些建议

public class Test {
public int hashCode(){
    System.out.println("hashcode method called");
    return this.toString().length();    
}

public boolean equals(Object obj) {
    System.out.println("equal method called ");
    int count = 0;
    if(!(obj instanceof String))
        return false;
    if (obj == this)
        return true;
    count = 0;
    StringTokenizer st = new StringTokenizer(((String)obj).toString(), " ");
    while(st.hasMoreTokens()){
        if(this.toString().contains(st.nextToken())){
            count ++;
        }
    }
    return (count == 3);
}

public static void main(String[] args) {

    HashMap<String, Integer> m = new HashMap<String, Integer>();

    String t1 = new String("A B C");
    String t2 = new String("B A C");
    String t3 = new String("C B A");

    m.put(t1, 27);
    m.put(t2, 34);
    m.put(t3, 45);

    System.out.println(m.get("A B C"));

    for(Entry e : m.entrySet()){
        System.out.println(((String)e.getKey())+":" +e.getKey().hashCode());
    }
}
}

共 (2) 个答案

  1. # 1 楼答案

    你的equals()hashCode()方法不会出现在图片中,因为映射键的类型是String,而不是Test。因此,我们使用了标准的字符串比较和哈希代码

    您需要修改Test,使其保存字符串,并相应地更改equals()hashCode()。然后需要将映射更改为HashMap<Test,Integer>类型

  2. # 2 楼答案

    密钥的哈希代码用于确定密钥的位置和唯一性。您正在向地图添加字符串对象,因此字符串。使用hashCode方法。 虽然您已经为测试类实现了hashCode,但这些代码并没有被使用

    为了解决您的问题,您可以创建自己的类作为密钥,并使用自己的hashCode实现。 使用您的示例,您可以向测试类添加一个可以保存字符串的属性,并将测试类用作映射中的键