Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以创建map类型的map键?_Java - Fatal编程技术网

Java 是否可以创建map类型的map键?

Java 是否可以创建map类型的map键?,java,Java,我想创建一个LinkedMap,它的键也是Map类型,如下所示: LinkedHashMap<LinkedHashMap<String, Float>, String> map = new LinkedHashMap <LinkedHashMap<String, Float>, String> LinkedHashMap映射= 新LinkedHashMap 有没有可能?如果是:如何调用映射键的键和值?是,您可以这样做 Linke

我想创建一个
LinkedMap
,它的键也是
Map
类型,如下所示:

LinkedHashMap<LinkedHashMap<String, Float>, String> map = 
       new LinkedHashMap <LinkedHashMap<String, Float>, String>
LinkedHashMap映射=
新LinkedHashMap
有没有可能?如果是:如何调用映射键的键和值?

是,您可以这样做

LinkedHashMap=新建LinkedHashMap()(Java 7表示法)

但由于map中的键是一个map,所以访问它将非常困难,因为您需要提供最可能相同的实例来检索字符串值。调试也会非常困难

您可能想尝试创建一个类来存储以map形式存储的数据,并编写适当的
hashcode()
equals()
实现来简化代码

是的,你可以这样做

LinkedHashMap=新建LinkedHashMap()(Java 7表示法)

但由于map中的键是一个map,所以访问它将非常困难,因为您需要提供最可能相同的实例来检索字符串值。调试也会非常困难


您可能想尝试创建一个类来存储以map形式存储的数据,并编写适当的
hashcode()
equals()
实现来简化代码

如果您有一个
映射
,它将另一个
映射
作为键,那么您将有一个不稳定的
映射
,因为从您正在使用键的任何
映射
中添加或删除键/值将更改其哈希码。所以,你应该永远不要这样做。密钥不应具有更改的哈希代码

如果您有一个
映射
,它将另一个
映射
作为键,那么您将有一个不稳定的
映射
,因为从您正在使用键的任何
映射
中添加或删除键/值将更改其哈希码。所以,你应该永远不要这样做。密钥不应具有更改的哈希代码

理论上,你可以这样做。java编译器不会对此提出任何抱怨

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

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

LinkedHashMap=新建LinkedHashMap();
Map key1=新的HashMap();
按键1。输入(“一”,1);
map.put(键1,“与键1关联的值”);
//这将打印:真的
System.out.println(map.containsKey(键1));
按键1。放置(“两”,2);
//在前面的语句之后,映射键1有一个新的hashCode()
//这将打印:false
//原因是:HashMap的hashCode()方法基于所有
//它包含的条目。自上一个键1.put(“两个”,2)起
//导致在映射中添加一个新条目,因此
//键1已更改。与此同时,LinkedHashMap没有
//重新哈希,这意味着仍然使用旧的
//哈希代码。这将进一步导致LinkedHashMap.containsKey()
//通过比较新哈希代码和旧哈希代码找不到键1
//一个
System.out.println(map.containsKey(键1));

理论上,你可以这样做。java编译器不会对此提出任何抱怨

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

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

LinkedHashMap=新建LinkedHashMap();
Map key1=新的HashMap();
按键1。输入(“一”,1);
map.put(键1,“与键1关联的值”);
//这将打印:真的
System.out.println(map.containsKey(键1));
按键1。放置(“两”,2);
//在前面的语句之后,映射键1有一个新的hashCode()
//这将打印:false
//原因是:HashMap的hashCode()方法基于所有
//它包含的条目。自上一个键1.put(“两个”,2)起
//导致在映射中添加一个新条目,因此
//键1已更改。与此同时,LinkedHashMap没有
//重新哈希,这意味着仍然使用旧的
//哈希代码。这将进一步导致LinkedHashMap.containsKey()
//通过比较新哈希代码和旧哈希代码找不到键1
//一个
System.out.println(map.containsKey(键1));

尝试此操作有什么问题?是的,您可以这样做。因为它希望密钥是object.if它编译,所以有可能->主java机密>)@injecteer并不总是这样。例如,.@injecteer:定义“可能”。运行时异常非常严重。尝试此操作有什么问题?是的,您可以这样做。因为它希望密钥是object.if它编译,所以有可能->主java机密>)@injecteer并不总是这样。例如,.@injecteer:定义“可能”。运行时异常非常严重。但是我需要在类1中注册信息,而不是在类2中使用它们,因为每个实例都保存了另一个标准,没有其他解决方案。如果您可以100%保证映射的哈希代码永远不会更改,那么您可以这样做,但我强烈建议您在没有该保证的情况下不要这样做。。。总有另一种方法可以做到这一点,它可能没有那么快,这可能与您的特定问题无关。但我需要在类1中注册信息,而不是在类2中使用它们,在每个实例中保存另一个标准,没有其他解决方案。如果您能100%保证地图的哈希代码永远不会更改,那么你可以这么做,但我强烈建议你不要在没有保证的情况下这么做。。。总有另一种方法可以做到这一点,它可能没有那么快,这可能与您的特定问题无关。