基于对象引用的Java映射?

时间:2011-04-26 22:47:35

标签: java

所以,我想使用一个java映射,其中键是一个对象......但不是键入对象的值,而是键入对象ID。因此,类似下面的内容将是完全有效的代码:

Map<String, Integer> map = new HashMap<String, Integer>();

String s1 = "hi!";
String s2 = "hi!";

map.put(s1, 10);
map.put(s2, 47);

这可能吗?有没有一种简单的方法可以在没有构建对象ID或类中过于繁琐的情况下执行此操作?基本上,我需要一种方法来将不断变化的值列表与给定对象相关联。对于具有相同值的对象,此值列表可能会有所不同,因此默认映射不起作用的原因。除了重构我的班级自己这样做(考虑到时间不是真正的选择),还有什么我可以使用的吗?

感谢。

编辑:更多信息。

上面的例子只是一个例子。我将使用它来实现统一成本搜索算法。对于使用此算法进行搜索的任何给定节点,还必须具有到目前为止所采用的路径。基于值的哈希映射不起作用的原因是该算法可以重复已经探索过的节点。在这一点上,路径会有所不同,尽管“我现在在哪里?”的价值。是完全相同的。

5 个答案:

答案 0 :(得分:20)

我认为IdentityHashMap可以解决问题。但是,由于您使用了字符串文字,因此两个字符串都将指向同一个实例。尝试使用s1 = new String(“hi!”)和s2 = new String(“hi!”)以及IdentityHashMap。

答案 1 :(得分:2)

查看GuavaMultimapsMultimap interface page上列出的实现)。

答案 2 :(得分:1)

您应该查看IdentityHashMap

  

此类实现Map   使用哈希表的接口   引用平等代替   比较键时的对象相等性   (和价值观)。

答案 3 :(得分:0)

您正在搜索多地图。 Java Collection Framework没有给你这个。但是你可以模仿它将LinkedList(最终与单个元素)关联到每个键。这很容易。

答案 4 :(得分:0)

为了完整起见:Guava's MapMaker使用身份等效的地图作为弱键和软键的默认值。查看代码here