请解释以下代码的输出。我猜它是null,因为命令行参数不同于它的键。但这不是正确的解释。它为null,因为朋友类不会覆盖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生日Draumur
答案 0 :(得分:1)
args[0]
将包含字符串"Draumur"
,因此这不是程序打印null
的原因。
HashMap
是一个哈希表,它根据键的哈希值在其中查找元素。如果不覆盖哈希方法,Java将根据对象标识计算哈希值,因此两个不同的Friends
对象,即使内部具有相同的name
,也不能保证哈希到相同的价值。
您还需要编写equals
方法,因为如果不覆盖它,Java也会认为两个不同的Friends
对象不相等,即使是相同的{{1}在里面。
总之,您需要覆盖name
方法,以便hashCode
可以找到HashMap
对象,并且您需要覆盖Friends
方法,以便{{1} 1}},当它找到它时,可以看到它是它正在搜索的对象。
这是equals
类的一个可能的新版本(我建议你称之为HashMap
,因为一个这样的对象代表一个朋友):
Friends
答案 1 :(得分:0)
地图的get
方法返回key
的值,其中地图键“.equals”用于研究密钥
您的好友密钥不实现equals
,因此使用Object
中的默认密钥,这是“==”比较(仅当它是同一个对象时才为真)。
Get
完全相同的对象, put
只能为您提供一些内容。
答案 2 :(得分:0)
命令行参数与其键
不同
不确定我理解那个逻辑......
args = {"Draumur"}
new Friends(args[0]) = new Friends("Dramur")
这样的密钥已经放置在地图中,但是朋友无法通过哈希码或其他方式与其他朋友对象进行比较。
如果你有一个String to String的HashMap,那么get("Dramur")
就不会为null。