是否可以创建类型地图的地图键?

时间:2014-02-26 13:57:20

标签: java

我想创建一个LinkedMap,其密钥类型为Map,如下所示:

LinkedHashMap<LinkedHashMap<String, Float>, String> map = 
       new LinkedHashMap <LinkedHashMap<String, Float>, String>

有可能吗?如果是:我如何调用Map Key的键和值?

3 个答案:

答案 0 :(得分:5)

如果你有一个Map以另一个Map为关键字,那么你将有一个不稳定的Map,因为在{{1}中添加或删除了键/值你正在使用密钥将改变他们的哈希码。所以,你应该从不这样做。密钥不应该有更改的哈希码!

答案 1 :(得分:1)

是的,你可以这样做。

LinkedHashMap<LinkedHashMap<String, Float>, String> map = new LinkedHashMap<>();(Java 7表示法)

但是,由于您在地图中的键是地图,因此您将很难访问它,因为您需要提供最可能相同的实例才能检索字符串值。调试也很难。

您可能想尝试创建一个类来存储以地图形式存储的数据,并编写正确的hashcode()equals()实现,您将简化代码。

答案 2 :(得分:1)

理论上,你可以做到这一点。 java编译器不会抱怨它。

但实际上,建议不要使用hashCode()可更新的任何对象作为键。原因是LinkedHashMap将使用键的hashCode(实际上,在对条目进行散列并查找某个键时,它是超类HashMap。

为了更好地理解,您将使用以下代码遇到以下问题:

LinkedHashMap<Map<String, Integer>, String> map = new LinkedHashMap<>();
Map<String, Integer> key1 = new HashMap<>();
key1.put("one", 1);
map.put(key1, "value associated with key1");

// this would print: true
System.out.println(map.containsKey(key1));

key1.put("two", 2);

// after previous statement, the map key1 has a new hashCode()

// this would print: false
// The reason is: the hashCode() method of HashMap is based on all
// the entries it contains. Since previous key1.put("two", 2)
// cause a new entry added into the map, thus the hashCode() of
// key1 has changed. In the meantime, the LinkedHashMap didn't
// rehash which means the key1 is still hashed using the old
// hashCode. This furthur lead to the LinkedHashMap.containsKey()
// cannot find the key1 by comparing the new hashCode and the old
// one 
System.out.println(map.containsKey(key1));