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 API或Apache的commons-collections中获取一个
我对他的要求有不同的解释。如果想要两个完全不同的键集访问相同的底层值怎么办。例如:
"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)
呃... ...
Map map = new HashMap();
Object someValue = new Object();
map.put(new Object(), someValue);
map.put(new Object(), someValue);
Run Code Online (Sandbox Code Playgroud)
现在,地图包含两次相同的值,可通过不同的键访问.如果这不是你想要的,你应该重写你的问题.:)