这是我的用例,我有一个逻辑上等于我的HashMap键但不是同一个对象(不是==)的对象。我需要从HashMap中获取实际键对象,以便我可以在其上进行同步。我知道我可以遍历ketSet,但与散列相比这很慢。
通过java.util.HashMap实现,我看到了一个正是我需要的getEntry(Object key)方法。知道为什么没有曝光吗?
你能想到我能把钥匙拿出来的其他任何方式吗?
答案 0 :(得分:4)
我认为你最好在价值上加一个额外的间接层。关键也应该是一个“纯粹”的价值。而不是:
Map<ReferenceObjectKey,Thing> map;
使用:
Map<ValueObjectKey,ReferenceObject<Thing>> map;
答案 1 :(得分:3)
我无法回答你的实际问题(为什么方法没有暴露)超出相当明显的范围,“因为作者决定不公开它。”
然而,你的问题让我相信你有一个相当奇怪的同步方案正在进行;根据我的理解,你只是试图用它来获得同等对象的规范表示。这听起来像是一个非常糟糕的主意,正如我在对这个问题的评论中所指出的那样。
更好的方法是重新审视您希望在这些关键对象上进行同步的方式和原因,并将同步更改为更清晰,更准确,最好是在更高级别或完全使用替代方法。
如果你发布了你想要对这个同步做什么的代码片段,那么它可能会有所帮助,这样其他人就可以用更清晰的方式来实现它。一个例子就是使用线程安全的地图类(例如ConcurrentHashMap),如果这确实是你想要在这里实现的。
编辑:看看How To Ask Questions The Smart Way,特别是我链接的要点,因为这是该缺陷的典型例子。您的整体设计似乎有点偏离,需要向不同的方向发展;所以当你遇到这个特定的问题时,这是一个更大问题的症状。给予我们更广泛的背景将使您获得更好的总体答案。
答案 2 :(得分:2)
实际上,调用者要求的方法会很有用。这可能是一个错误,它或类似的东西没有被包括在内。
实际上,假设您希望增加从键“a”映射的Integer值 - 您最终必须对“a”进行两次哈希查找。假设您要区分不存在的值和存在的值但是映射为null - 再次,两次哈希查找。
在实践中,世界并没有因此而结束。
答案 3 :(得分:1)
我最近最近偶然发现了这个问题。当我把问题充分解决时,我实际上是在使用两种不同的方法将数据与用于确定相等性的密钥对象部分相关联。
我在密钥类中使用List来确定相等性和哈希码,其中还有3个字段 - 布尔值和2个字符串。最后,我将地图重新制作为地图&lt; List&lt; String&gt;,...&gt;并将其他3个字段重构为自己的类,然后将原始类作为List和新类的组合。在此之后,我觉得代码似乎更好。
答案 4 :(得分:0)
这听起来像是一个更深层次的问题。你为什么需要这样的东西?为什么键不是唯一的对象?
你是什么意思“所以我可以同步它”?
答案 5 :(得分:-1)
我很抱歉,但你似乎在这里有一个概念性的突破。
如果您的问题是您将一个等效对象(.equals()为true但==为false)并且需要找到密钥,那么使用对象变量get将无法帮助您,因为Object支持的唯一.equals是identity(==)。
你需要做的是在你的密钥类中实现equals()和hashcode()。
这将使获得该条目变得微不足道。