Java映射类,可以为一个值包含两个或多个键

Java映射类,可以为一个值包含两个或多个键,java,map,key,Java,Map,Key,我正在寻找一个Java映射类,它可以为一个值包含两个或多个键。它几乎与apache公共集合中的一样,但是它只能使用其中一个键来检索值,而不是使用所有键 例如,要在地图中使用键“key1”和“key2”为值“Hello World”创建条目: 然后,如果我想获得值,我可以使用两种可能的方法: String value = map.get("key1"); 或 在MultiKeyMap中,需要指定所有键以检索值: String value = map.get("key1", "k

我正在寻找一个Java映射类,它可以为一个值包含两个或多个键。它几乎与apache公共集合中的一样,但是它只能使用其中一个键来检索值,而不是使用所有键

例如,要在地图中使用键“key1”和“key2”为值“Hello World”创建条目:

然后,如果我想获得值,我可以使用两种可能的方法:

    String value = map.get("key1");


在MultiKeyMap中,需要指定所有键以检索值:

    String value = map.get("key1", "key2");

更新:

人们告诉我使用常规的Map类,但我不确定一个有两个键指向同一个值的Map是否会生成两个重复的值,或者不在内存中。因此,任何人都可以确认这一点?

为什么不在常规地图中重复每个键的值?

嗯,在我看来,您可以通过执行以下操作来近似您想要的值:

map.put("key1", "Hello World");
map.put("key2", "Hello World");
然后
key1
key2
都将返回“Hello World”


当然,这不会将逻辑上重复的值合并为单个引用。但你真的想这么做吗?如果你在地图上放置任何类型的可变类型,这样的事情可能会导致令人困惑的副作用。

我不清楚为什么使用标准的
地图
不起作用<代码>映射
可以包含从不同键到相同值的映射。问题是您希望通过一次删除来删除所有其他相关键吗?如果不同时指定这两个键,可能会返回多个值,map.get(“key1”)应该返回strings@Maurice:OP在哪里说他想将一个键映射到多个值?马克·彼得斯:我不确定你读这个问题的方式是否和我一样(或是OP是)。@马克·彼得斯:嗯,提到了多键映射,如果一个键只能映射一个值,那么一个普通的映射就可以了。不幸的是,今天这里没有二等奖。是的,它可以使用这种方式,但我不确定一个带有指向同一个值的两个键的映射是否会生成两个重复的值,或者不在内存中。那么任何人都可以证实这一点吗?映射实际上包含对对象的引用,因此两个不同的键可以映射到一个值的两个引用。如果在类中两次使用字符串文字“Hello World”,则只会创建一个字符串实例。您可以通过在两个映射值中使用==操作符来验证这一点,以检查引用是否引用了相同的对象。所以说,说“Hello World”的两个字符串总是同一个实例。@Joe
“Hello World”!=新字符串(“Hello World”)
是的,它可以使用这种方式,但我不确定带有指向同一值的两个键的映射是否会生成两个重复值,或者是否不在内存中。所以任何人都可以确认这一点?地图将只保留对对象的引用,而不是复制它。将对象放入地图不会生成您的对象,它们已经存在。你担心表现吗?我们谈论的地图和物体有多大?@DmitryB:我明白了,就是这样。好的,那么我将使用常规地图(除非这里有其他人可以建议更好的解决方案)。是的,我担心两件事:性能和内存空间。地图将包含大约8000多个唯一键,但唯一值将是它的一半(4000+。@suud,假设你的地图使用128 MB内存(每个键/值16 KB),这相当于1美元的内存。我想说这值得你花几分钟在上面。如果地图比这小得多,就少花钱
    String value = map.get("key1", "key2");
map.put("key1", "Hello World");
map.put("key2", "Hello World");