为什么getEntry(Object key)没有在HashMap上公开?

这是我的用例,我有一个逻辑上等于我的HashMap键但不是同一个对象(不是==)的对象。 我需要从HashMap中获取实际键对象,以便我可以在其上进行同步。 我知道我可以遍历ketSet,但与散列相比,这是缓慢的。

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

你能想到我能把钥匙拿出来的其他任何方式吗?

我认为你最好在值上添加一个额外的间接层。 关键也应该是一个“纯粹”的价值。 代替:

Map map; 

使用:

 Map> map; 

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

但是你的问题让我相信你有一个相当奇怪的同步方案正在进行中; 根据我的理解,你只是试图用它来获得同等对象的规范表示。 这听起来像是一个非常糟糕的主意,正如我在对这个问题的评论中指出的那样。

一种更好的方法是重新审视您希望如何以及为什么要在这些关键对象上进行同步,并将同步更改为更清晰和更健全,最好是在更高级别或完全使用替代方法。

如果您发布了一个代码片段,告诉您要对此同步做什么,以便其他人可以用更清晰的方式来实现它,这可能会有所帮助。 一个例子就是使用线程安全的映射类(例如ConcurrentHashMap ),如果这确实是你想要在这里实现的。

编辑:看看如何提出问题智能方式 ,特别是我链接的要点,因为这是该缺陷的典型例子。 您的整体设计似乎有点偏离,需要向不同的方向发展; 所以当你遇到这个特定的问题时,这是一个更大问题的症状。 为我们提供更广泛的背景将使您获得更好的整体答案。

实际上,调用者要求的方法会很有用。 这可能是一个错误,它或类似的东西没有被包括在内。

实际上,假设您希望增加从键“a”映射的Integer值 – 您最终必须对“a”执行两次哈希查找。 假设您要区分不存在的值和存在的值但是映射为null – 再次,两个哈希查找。

然而,在实践中,世界并没有因此而结束。

我最近最近偶然发现了这个问题。 当我把问题充分解决时,我实际上是使用两种不同的方法将数据与用于确定相等性的关键对象部分相关联。

  • 使用映射到的键的值,通过Map
  • 使用密钥对象包含的数据,但未在.equals()/ hashCode方法中使用,通过组合。

我在密钥类中使用List来确定相等性和哈希码,其中还有3个其他字段 – 布尔值和2个字符串。 最后,我将地图重新​​制作为Map ,…>并将其他3个字段重构为自己的类,然后将原始类作为List和新类的组合。 我觉得这之后代码似乎更好了。

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

你是什​​么意思“所以我可以同步它”?

对不起,你似乎在这里有一个概念性的突破。

如果你的问题是你“持有”一个等效的对象(.equals()是真的但是==是假的)一个密钥,并且需要找到密钥,使用对象变量get对你没有帮助,因为只有Object支持的.equals是identity(==)。

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

这将使得获得该条目变得微不足道。