哈希映射获取方法

时间:2017-09-02 05:59:16

标签: java collections hashmap

请解释以下代码的输出。我猜它是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

3 个答案:

答案 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。