gpt4 book ai didi

java - HashMap 获取方法

转载 作者:行者123 更新时间:2023-12-02 12:18:01 25 4
gpt4 key购买 nike

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

最佳答案

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

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

您还需要编写一个 equals 方法,因为如果您不重写它,Java 也会认为两个不同的 Friends 对象不相等,即使里面有相同的名称

总之,您需要重写 hashCode 方法,以便 HashMap 可以找到 Friends 对象,并且您需要重写 equals 方法,因此 HashMap 在找到它时,可以看到它就是它正在搜索的对象。

这是 Friends 类的一个可能的新版本(我还建议您将其称为 Friend,因为一个这样的对象代表一个 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();
}
}

关于java - HashMap 获取方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46010935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com