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
HashMapJava中的密钥_Java_Hashmap - Fatal编程技术网

HashMapJava中的密钥

HashMapJava中的密钥,java,hashmap,Java,Hashmap,在Java中使用HashMap时,我通常会遇到如下场景: 我有一个a类对象列表(list) A有int f1、int f2和其他字段 我必须从列表中构造一个映射来执行a对象的O(1)查找。关键是f1和f2的组合(两者都是整数) 现在,以下哪项是地图的最佳实践 案例1:一般情况下 情况2:f2只能获取2到3个不同的值,而f1可以获取大量的值 Map<Integer, Map<Integer, List<A>>> // construction of map i

在Java中使用HashMap时,我通常会遇到如下场景:

我有一个a类对象列表(
list

A有int f1、int f2和其他字段

我必须从列表中构造一个映射来执行a对象的O(1)查找。关键是f1和f2的组合(两者都是整数)

现在,以下哪项是地图的最佳实践
案例1:一般情况下
情况2:f2只能获取2到3个不同的值,而f1可以获取大量的值

Map<Integer, Map<Integer, List<A>>>  // construction of map is cumbersome
Map<String, List<A>>                 //(key : String f1 + "_" + f2)
Map<Integer, List<A>>          //(I tend to use this for case 2)
Map//Map的构造很麻烦
映射/(键:字符串f1+“”+f2)
Map//(我倾向于将其用于案例2)

这里没有澄清一件事。f1和f2不能唯一标识A的对象。更正了映射定义。

如果这两个字段趋向于不可变(设置后不会更改),则可以重写A的
equals()
hashCode()
方法,只需存储A:

Set<A>    //(key: fields f1 and f2, via hashCode() method)
Set//(键:字段f1和f2,通过hashCode()方法)

如果它们不是不可变的,您无论如何也不能将它们用于键,因为它们可能会更改。

我认为Map适合于案例1,对于案例1,我建议使用List,而这个列表只有2-3个元素,那么您可以将索引映射到特定的字段值。

为什么要使用Map?如果您真的不需要键值对,您可以使用
哈希集
。查找仍然是O(1),您不必费心从键中获取值


当然,HashSet可能只是一个具有空值的HashMap,但您不必发明键和值。

我不喜欢使用字符串作为复合键。一些博主说得很好:字符串对文本内容有好处,而对非文本内容没有好处


为什么不创建一个简单的
IntPair
类,其中包含两个
int
字段,以及相应的
hashCode()
equals(Object)
覆盖?在IDE中只需两秒钟(没有IDE的时间不会太长),您将拥有一个更具体、语义上更有意义的键类型。

键在HashMap中是唯一的…因为在java中,键的内部设置为

final Key
java中的int静态入口类


这就是为什么钥匙是唯一的,它不允许重复…

这三个都是很好的选择。使用哪一种取决于您的具体情况。