【问题标题】:Searching an object in a java map在 Java 地图中搜索对象
【发布时间】:2011-11-29 20:35:35
【问题描述】:

我是 Java 新手,我正在使用 Map 类及其派生类。

我只是想知道如何在其中找到元素。是否仅执行指针/引用检查?

假设我有一个TreeMap<MyObject, Integer>。如果我有一个对象x,我希望您搜索一个整数v,使其键与x“相等”,即使它们是MyObject 类的2 个单独实例,因此有2 个不同的指针。

是否有任何方法(接口/超类)可以进行这种操作?

提前致谢。

【问题讨论】:

  • 如果key相同,则该key指向的map中只有一个对象。
  • containsKeycontainValue这样的map中的所有搜索操作都是基于equals方法,所以它不检查'指针'值而是对象相等性(默认为hashValue)

标签: java map polymorphism treemap


【解决方案1】:

在 Map 及其实现中涉及比较的所有方法都使用对象的“equals”方法。如果您尝试将键+值添加到已经包含一个条目的 Map 中,该条目的键将与之比较,那么新的键+值将替换旧的键。

the documentation:

例如,containsKey(Object key) 方法的规范说:“当且仅当此映射包含键 k 的映射时才返回 true,使得 (key==null ? k==null : key.equals (k))。”

如果实现可以通过其他方式(例如比较哈希码)确定键“不相等”,则该实现可能不会执行任何相等比较。

【讨论】:

  • 其实equals和compareTo这两种方法我都实现了,但是我发现正如Emmanuel Sys之前所说,hashCode方法也用于比较,但现在我需要了解如何使用它。
  • 比较包括以下内容: 1) 比较哈希码,如果哈希码不相等则不匹配。 2) 如果哈希码相等,则使用 equals 方法进行比较。 stackoverflow上有很多问题讨论equals和hashcode的关系,请看。
  • 但是树形图也使用哈希码吗?正如你在上一篇文章中所说,它使用了一棵红黑树,所以不应该有散列,应该吗?
  • 是的,这取决于底层的 Map 实现。 TreeMap 不使用哈希码(相反,它需要键来实现 Comparable 接口),另一方面,HashMap 使用哈希码。
  • 其实MyObject类实现了Comparable但还是没有成功:(
【解决方案2】:

在你的例子中,你会这样做

 TreeMap<MyObject, Integer> tree = ...
 Integer i = tree.get(x);

get(x) 将遍历您的keys() 并返回与aKey.equals(x) 匹配的键的整数值。

【讨论】:

    【解决方案3】:

    在大多数情况下,Maps 由哈希表支持,并且与HashMap 非常相似。 TreeMap 通过在树上上下指针来为每个节点提供更多信息,但查找仍然通过哈希完成(我相信)

    【讨论】:

    • 没有。 TreeMap 使用元素顺序(比较器或自然顺序)并且不使用 hashCodes。
    • Java 中的 Treemap 是使用红黑树实现的:en.wikipedia.org/wiki/Red%E2%80%93black_tree。所以没有散列。
    • @unbeli - 酷。每天学习新东西:)
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2012-09-23
    • 2012-10-19
    • 2016-01-07
    • 1970-01-01
    相关资源
    最近更新 更多