Java 哈希映射获取方法

Java 哈希映射获取方法,java,collections,hashmap,Java,Collections,Hashmap,请解释下面代码的输出。我猜它为null,因为命令行参数与其键不同。但这不是正确的解释。它为null,因为friends类不重写equals和hashcode方法 但是为什么呢 import java.util.*; public class Birthdays { public static void main(String[] args) { Map<Friends, String> hm = new HashMap<Friends, String&g

请解释下面代码的输出。我猜它为null,因为命令行参数与其键不同。但这不是正确的解释。它为null,因为friends类不重写equals和hashcode方法

但是为什么呢

import java.util.*;
public class Birthdays {
    public static void main(String[] args) {
        Map<Friends, String> hm = new HashMap<Friends, String>();
        hm.put(new Friends("Charis"), "Summer 2009");
        hm.put(new Friends("Draumur"), "Spring 2002");
        Friends f = new Friends(args[0]);
        System.out.println(hm.get(f));
    }
}

class Friends {
    String name;
    Friends(String n) { name = n; }
}
以及命令行调用: java Birthdays Draumur

args[0]将包含字符串Draumur,因此这不是程序打印null的原因

HashMap是一个哈希表,它根据键的哈希值查找其中的元素。如果不重写hash方法,Java将根据对象标识计算hash值,因此两个不同的Friends对象,即使内部名称相同,也不能保证哈希值相同

你还需要编写一个等值方法,因为如果你不重写它,java也会考虑两个不同的朋友对象,即使在里面有相同的名称也不相等。 总之,您需要重写hashCode方法,以便HashMap可以找到Friends对象,并且您需要重写equals方法,以便HashMap在找到它时可以看到它是正在搜索的对象

下面是Friends类的一个可能的新版本,我还建议您将其称为Friend,因为一个这样的对象代表一个朋友:

class Friends {
    String name;
    Friends(String n) { name = n; }
    public boolean equals(Object o) {
        if (!(o instanceof Friends))
            return false;
        Friends rhs = (Friends)o;
        return (name.equals(rhs.name));
    }
    public int hashCode() {
        return name.hashCode();
    }
}
映射的get方法返回键的值,其中map key.等于键

您的Friends键不实现equals,因此使用对象中的默认值,只有当它是同一个对象时,才使用==比较true

Get只会给你一些东西,如果你使用完全相同的对象,你把钥匙

命令行参数与其键不同

我不确定我是否理解这个逻辑。。。 args={Draumur} new Friendsargs[0]=新FriendsArmur

这样的键已经放在地图中了,但是通过hashcode或equality,Friend无法与其他Friend对象进行比较


如果您有一个字符串到字符串的哈希映射,那么getDramur将不会为null

args[0]=Dramur或args[0]=java?java是可执行文件。生日是主要的课程。其他的都是args