Java 哈希映射获取方法
请解释下面代码的输出。我猜它为null,因为命令行参数与其键不同。但这不是正确的解释。它为null,因为friends类不重写equals和hashcode方法 但是为什么呢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
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 Draumurargs[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