我想创建一个LinkedMap
,其密钥类型为Map
,如下所示:
LinkedHashMap<LinkedHashMap<String, Float>, String> map =
new LinkedHashMap <LinkedHashMap<String, Float>, String>
有可能吗?如果是:我如何调用Map Key的键和值?
答案 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));