代码之家  ›  专栏  ›  技术社区  ›  mR_fr0g

为什么getEntry(object key)没有在hashmap上公开?

  •  4
  • mR_fr0g  · 技术社区  · 15 年前

    这里是我的用例,我有一个对象,逻辑上等于我的hashmap键,但不是同一个对象(不是==)。我需要将actuall键对象从hashmap中取出,以便在其上进行同步。我知道我可以遍历kesets,但是与散列相比,这是很慢的。

    通过java.util.hashmap实现,我看到了一个getEntry(object key)方法,这正是我需要的。你知道为什么这件事没有曝光吗?

    你能想出其他办法把钥匙拔出来吗?

    6 回复  |  直到 15 年前
        1
  •  4
  •   Tom Hawtin - tackline    15 年前

    我认为你最好在价值上多加一层间接性。键也应该是一个“纯”值。而不是:

    Map<ReferenceObjectKey,Thing> map;
    

    用途:

    Map<ValueObjectKey,ReferenceObject<Thing>> map;
    
        2
  •  3
  •   Andrzej Doyle    15 年前

    我无法回答你的实际问题(为什么方法没有被公开),除了相当明显的“因为作者决定不公开它”。

    然而,您的问题让我相信您正在进行一个相当奇怪的同步方案;根据我的理解,您只是试图调用它来获得用于同步的相等对象的规范表示。正如我在对这个问题的评论中所指出的,这听起来是一个非常糟糕的想法。

    一个更好的方法是重新审视您希望在这些关键对象上同步的方式和原因,并重新编写您的同步以使其更清晰、更理智,最好是在更高的级别上,或者完全使用另一种方法。

    如果你发布了一段代码片段,说明你想用这个同步来做什么,这样其他人就可以以一种更干净的方式来实现它,给出他们的意见,这可能会有所帮助。一个简单的例子就是使用线程安全映射类(例如 ConcurrentHashMap ,如果这确实是你在努力实现的目标。

    编辑:看看 How To Ask Questions The Smart Way 尤其是我提到的要点,因为这是一个典型的缺陷例子。似乎你的总体设计有点过时,需要朝着不同的方向发展;所以当你陷入这个特定的问题时,这是一个更大问题的症状。给我们更广泛的背景将导致你得到更好的总体答案。

        3
  •  2
  •   Kevin Bourrillion Gergely    15 年前

    实际上,调用者请求的方法是有用的。可以说,这是一个错误,它或类似的东西,不包括在内。

    实际上,假设您希望增加从键“a”映射的整数值,那么您最终必须对“a”执行两次哈希查找。假设您想要区分一个值不存在和一个值存在但映射到空值——同样,两个哈希查找。

    实际上,世界并没有因此而结束。

        4
  •  1
  •   user968208    13 年前

    最近我自己偶然发现了这个问题。当我把问题归结为足够多的时候,实际上我使用了两种不同的方法将数据与用于确定相等性的关键对象部分关联起来。

    • 通过映射键映射到的值
    • 包含键对象的数据,但在.equals()/hashcode方法中没有使用,通过组合。

    我在key类中使用了一个列表来确定相等性和哈希代码,其中还有3个字段-布尔值和2个字符串。最后,我将映射重新映射为map<list<string>、…>,并将其他3个字段重构为它们自己的类,然后将原始类作为列表和新类的组合。我觉得在这之后代码似乎更好。

        5
  •  0
  •   Stefan Hendriks    15 年前

    这听起来像是一个更深层次的问题。你为什么需要这样的东西?为什么键对其对象不是唯一的?

    “这样我就可以在上面同步”是什么意思?

        6
  •  -1
  •   CPerkins    15 年前

    我很抱歉,但你在这里似乎有一个概念上的突破。

    如果您的问题是对一个键“持有”一个等价的对象(.equals()为真,但==为假),并且需要查找该键,那么使用get的对象变量对您没有帮助,因为该对象支持的唯一.equals是标识(==)。

    您需要做的是在密钥类中实现equals()和hashcode()。

    这将使得获取条目变得很简单。