HashMapJava中的密钥
在Java中使用HashMap时,我通常会遇到如下场景: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
我有一个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静态入口类
这就是为什么钥匙是唯一的,它不允许重复…这三个都是很好的选择。使用哪一种取决于您的具体情况。