【问题标题】:Map returns different value for two equivalent keysMap 为两个等效键返回不同的值
【发布时间】: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


【解决方案1】:

这是逻辑,authTokenauthToken2 不是相似的对象,但是当您比较它们时,它会比较键,这就是给出 true 的原因

但是从对象的角度来看它是不同的

该地图采用键为 AuthToken 的元素,您使用带有 authToken 的元素为其提供元素,因此当您尝试将其与 authToken2 进行比较时,找不到它,因为它不等于给定的第一个元素` (即使使用相同的“key”,这两个对象也不相似:尝试对这两个对象进行哈希处理,您会发现您会得到不同的哈希值)

【讨论】:

    【解决方案2】:

    java中的方法.equals()并不代表两个对象相同,可以是同一个引用,也可以是自己实现的比较方法。

    如果它们作为不同的创建对象,将.equals()作为true获取,这确实意味着有一个自我实现的比较。

    您收到该响应是因为 authTokenauthToken2 不是相同的对象并且它们不共享相同的哈希值,因此哈希映射无法在其键列表中找到 authToken2 的哈希值。

    【讨论】:

      猜你喜欢
      • 2019-04-15
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2022-01-18
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多