Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.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 使用数组作为hashmap键_Java - Fatal编程技术网

Java 使用数组作为hashmap键

Java 使用数组作为hashmap键,java,Java,我试图使用数组作为HashMap中的键。数组的长度为2,因此它们基本上充当2元组。实现定制的2元组类是最后的选择。问题是,如果具有相同内容的数组具有不同的内存位置,我希望它们映射到HashMap中的不同位置。我知道Arrays.hashCode和Arrays.deepHashCode中有hashCode函数,但是有没有办法将它们用于HashMap。正如我已经说过的,我真的不想实现我自己的tuple类 我不推荐这种方法 密钥必须是不可变的。除非你把你的阵型做好,否则会充满危险 Java是一种面向对

我试图使用数组作为HashMap中的键。数组的长度为2,因此它们基本上充当2元组。实现定制的2元组类是最后的选择。问题是,如果具有相同内容的数组具有不同的内存位置,我希望它们映射到HashMap中的不同位置。我知道Arrays.hashCode和Arrays.deepHashCode中有hashCode函数,但是有没有办法将它们用于HashMap。正如我已经说过的,我真的不想实现我自己的tuple类

我不推荐这种方法

密钥必须是不可变的。除非你把你的阵型做好,否则会充满危险

Java是一种面向对象的语言。我认为从原语的角度考虑太多是错误的。封装对象中所需的正确行为

为什么创建自己的类如此令人压抑?终极手段我不明白这为什么这么重要。创造它,使它不变,清楚地记录你的意图,然后继续前进

更新:我不会让您已经有一个有缺陷的tuple类这一事实阻止您在这种情况下做正确的事情。你说你有“数百门课”——我说用一门课做正确的事情不会让你崩溃。通过积累“实际的”错误决策(如您即将做出的决策),代码最终会变得一团糟。通过为这个狭窄的问题创建正确的解决方案,决心不要增加问题的症结,并开始从那里找到更好的答案

问题是,如果具有相同内容的数组具有不同的内存位置,我希望它们映射到HashMap中的不同位置


阵列是否具有不同的内存位置,或者阵列的内容是否具有不同的内存位置?如果是前者,您可能可以使用一个而不是普通的
HashMap
。但是,如果是后者,那么我非常同意@duffymo的回答:;)

好的,我找到了解决办法。我没有使用数组,而是使用列表。这是因为列表通过内容而不是引用来确定相等性

我们已经有了一个元组实现,但是我们的序列化程序无法序列化它,我需要序列化这些信息。我不打算复制功能,我们的元组实现是我们项目的主要数据结构之一,它跨越数百个类。正确的解决方案是将其吸收并编写新的
类,或者更好地编写一个具有更具体名称和特定字段名称的类。当不同的元素具有不同的含义时,不应使用数组。即使有某种方法可以在这里使用
array.equals
array.hashCode
——这里没有——编写一个新类无疑是正确的解决方案。@Max-简单的解决方案是更改现有(不可变)元组类型,使其可序列化。有什么风险?使元组类可序列化不能破坏不尝试序列化元组的现有代码…对自身的引用?你是说“这个”?我很高兴我没有在那个系统上工作。祝你好运。@Max-克鲁夫特在系统中积累的主要原因是因为你正在做的决定……我不久前遇到了大致相同的问题,于是放弃了。我认为您无法更改基元数组的哈希行为。考虑到这一点,引入新的
SerializableTuple
类是一个很好的例子。