需要一个Java映射/表,其中包含多个键到一个值.价值通常会改变

Dun*_*can 11 java collections hashmap

我需要的是一个允许多个键访问单个对象的集合.

我需要经常更改此对象.

对于500k +条目,它也必须是高效的.

oxb*_*kes 19

任何实现java.util.Map<K,V>都会这样做 - 对于在单独的键下添加特定值的次数没有限制:

Map<String,Integer> m = new HashMap<String, Integer>();
m.put("Hello", 5);
m.put("World", 5);
System.out.println(m); // { Hello->5, World->5 }  
Run Code Online (Sandbox Code Playgroud)

如果您想要一个地图,其中单个键与多个值相关联,这称为多地图,您可以从google java collections APIApache的commons-collections中获取一个

  • 此方法的问题是您无法从与其关联的所有键中快速删除该对象 (4认同)

fra*_*orl 7

我对他的要求有不同的解释。如果想要两个完全不同的键集访问相同的底层值怎么办。例如:

    "Hello"    ------|
                     |----> firstObject
       3       ------|

    "Monkey"   ------|
                     |----> secondObject
       72      ------|

       14      -----------> thirdObject

   "Baseball"  ------|
                     |----> fourthObject
       18      ------|
Run Code Online (Sandbox Code Playgroud)

显然有两个映射,一个用于整数键,一个用于字符串键,是行不通的,因为一个映射中的更新不会反映在另一个映射中。假设您修改了Map<String,Object>,更新“Monkey”以映射到第五对象。这个修改的结果是改变了Entry<String,Object>那张地图内的,但这当然对另一张地图没有影响。所以虽然你的意图是:

    "Monkey"   ------|
                     |----> fifthObject
       72      ------|
Run Code Online (Sandbox Code Playgroud)

你在现实中得到的是这样的:

    "Monkey"   -----------> fifthObject

       72      -----------> secondObject
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我所做的是让两个并排映射,而不是让他们说Map<String, Integer>我会制作它们Map<String, Integer[]>,其中关联的数组是单个成员数组。我第一次将键与值关联时,如果尚不存在数组并且键返回 null,我会创建该数组,并将我希望与之关联的任何其他键(在该键的映射中)关联起来。随后,我只修改数组的内容,但从不修改对数组本身的引用,这很有魅力。

    "Monkey"   -------> fifthObjectArray ------|
                                               |-----> fifthObjectArray[0]
       72      -------> fifthObjectArray ------|
Run Code Online (Sandbox Code Playgroud)


Bom*_*mbe 5

呃... ...

Map map = new HashMap();
Object someValue = new Object();
map.put(new Object(), someValue);
map.put(new Object(), someValue);
Run Code Online (Sandbox Code Playgroud)

现在,地图包含两次相同的值,可通过不同的键访问.如果这不是你想要的,你应该重写你的问题.:)