【发布时间】:2020-05-18 03:45:11
【问题描述】:
我有一个映射,它在使用相同的 AuthToken 时返回预期的映射。但是,当使用等效的 AuthToken authToken2 时,它会返回 null。我想不出这种行为的任何原因,它让我发疯。我在这里遗漏了什么明显的东西吗?
//initialize stuff
User user = new User("Test", "User",
"https://faculty.cs.byu.edu/~jwilkerson/cs340/tweeter/images/donald_duck.png");
AuthToken authToken = new AuthToken("key");
HashMap<AuthToken, User> loggedInUsersByAuthToken = new HashMap<>();
loggedInUsersByAuthToken.put(authToken, user);
AuthToken authToken2 = new AuthToken("key");
System.out.println("authToken equals authToken2? " + authToken.equals(authToken2));
System.out.println("value from authToken is null? " + (loggedInUsersByAuthToken.get(authToken) == null));
//unexpected behaivor
System.out.println("value from authToken2 is null? " + (loggedInUsersByAuthToken.get(authToken2) == null));
System.out.println 语句打印如下:
authToken equals authToken2? true
value from authToken is null? false
value from authToken2 is null? true
【问题讨论】:
-
两个
AuthToken对象对于hashCode方法的结果是否相同? -
@DawoodibnKareem Welp 我觉得自己很笨。谢谢,这就是问题所在。 HashMap ...答案就在名称中。奇怪的是,javadocs 说对于 Map.get 方法,如果根据 Objects.equals() 键相等,它们将返回相同的值,但至少现在我知道了。
-
是的,诀窍是 Object 的 Javadoc 告诉您,如果您覆盖
equals,您通常也需要覆盖hashCode,它解释了原因。
标签: java dictionary hashmap