Java 为什么getEntry(对象键)没有在HashMap上公开?

Java 为什么getEntry(对象键)没有在HashMap上公开?,java,concurrency,hashmap,Java,Concurrency,Hashmap,这是我的用例,我有一个逻辑上等于HashMap键的对象,但不是同一个对象(not==)。我需要从HashMap中获取实际的key对象,以便在上面进行同步。我知道我可以在ketSet上进行迭代,但与哈希相比,这是一个缓慢的过程 通过查看java.util.HashMap实现,我看到了一个getEntry(对象键)方法,这正是我所需要的。你知道为什么没有曝光吗 你能想出别的办法把钥匙拿出来吗?这听起来像是你遇到的更深层次的问题。你为什么需要这样的东西?为什么键不是其对象所独有的 “这样我就可以在上面

这是我的用例,我有一个逻辑上等于HashMap键的对象,但不是同一个对象(not==)。我需要从HashMap中获取实际的key对象,以便在上面进行同步。我知道我可以在ketSet上进行迭代,但与哈希相比,这是一个缓慢的过程

通过查看java.util.HashMap实现,我看到了一个getEntry(对象键)方法,这正是我所需要的。你知道为什么没有曝光吗


你能想出别的办法把钥匙拿出来吗?

这听起来像是你遇到的更深层次的问题。你为什么需要这样的东西?为什么键不是其对象所独有的


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

我无法回答你的实际问题(为什么这个方法没有公开)除了非常明显的“因为作者决定不公开它”

然而,你的问题让我相信,你有一个相当奇怪的同步方案正在进行;据我所知,您只是试图调用它来获得用于同步的相等对象的规范表示。正如我在对问题的评论中所指出的那样,这听起来真是个糟糕的主意

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

如果您发布了一段代码片段,说明您希望如何处理此同步,以便其他人可以就更干净的实现方法发表意见,这可能会有所帮助。一个简单的例子是使用线程安全的映射类(如),如果这确实是您在这里试图实现的


编辑:看一看,特别是我链接的要点,因为这是一个典型的缺陷示例。看起来你的整体设计有点不对劲,需要换个方向;所以,当你被困在这个特定的问题上时,这是一个更大问题的症状。给我们一个更广泛的背景会让你得到更好的整体答案。

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

Map<ReferenceObjectKey,Thing> map;
Map;
使用:

Map;
很抱歉,您似乎在概念上有了突破

如果您的问题是您“持有”一个与某个键等价的对象(.equals()为true,但==为false),并且需要查找该键,那么使用get的对象变量将不会有帮助,因为该对象支持的唯一.equals是identity(=)

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


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

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

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


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

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

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

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

如果没有其他方法,您可以通过反射获得它,并且仍然使用。逻辑相等=相等方法覆盖?HashMap始终使用等于而不是==。通常不鼓励使用可变对象作为键类。@Geo:我不太相信使用反射来获取要同步的对象;部分是因为性能问题,但主要是因为非常量对象上的显式同步很难实现,更不用说通过反射不透明地获取引用了。这可能很难理解、跟踪和调试,使维护成为一场噩梦。是的,这是我的问题。我有一个对象,myobject.equals(key)=true,但myobject==key返回false。我需要得到key对象。@Geo:获取HashMap实现内部的方法或对象不是一个好主意。HashMap的内部不是Java的公共API的一部分,可能会在Java的未来版本中发生变化,或者HashMap可能会在另一个供应商的HashMap实现中以完全不同的方式实现。我想我们需要的是所有对相同对象的调用(即映射到HashMap中的同一个键),获取对一致对象对象的访问以进行同步。querent没有说他为什么要这样做,但这听起来像是在试图阻止两个线程同时修改给定密钥的映射。我认为你是对的。使用ConcurrentHashMap可以解决他的问题,当然,如果关于问题的假设是正确的:)这可能不一定是这里的问题-例如,
字符串
键仍然会导致上面声明的相同问题(除非你
插入所有字符串,这是一个坏主意);我从未听人说过字符串是不合适的地图键。我不懂<代码>字符串Map<ValueObjectKey,ReferenceObject<Thing>> map;