HashMapJava中的密钥
在Java中使用HashMap时,我通常会遇到如下场景:
我有一个a类对象的列表(List<A>
)
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)
这里没有澄清一件事。f1和f2不能唯一标识A的对象。已更正贴图定义
# 1 楼答案
如果这两个字段往往是不可变的(一旦设置,它们就不会更改),则可以重写A的
equals()
和hashCode()
方法,只需存储A:如果它们不是不可变的,那么无论如何都不能将它们用作密钥,因为它们可能会更改
# 2 楼答案
密钥在HashMap中是唯一的。。。因为java内部的密钥设置为
java中的int静态入口类
这就是为什么密钥是唯一的它不允许重复
# 3 楼答案
我不喜欢使用字符串作为复合键。一些博主说得很好:字符串对文本内容有好处,但对非文本内容没有好处
为什么不创建一个简单的
IntPair
类,其中包含两个int
字段,以及适当的hashCode()
和equals(Object)
重写?在IDE中只需两秒钟(没有IDE的时间不会太长),就可以得到一个更具体、语义上更有意义的键类型# 4 楼答案
我认为Map适用于case 1,对于case,我推荐List,这个列表只有2-3个元素,然后你可以将索引映射到特定的字段值
# 5 楼答案
为什么要用地图?如果你真的不需要键值对,你可以使用
HashSet<A>
。查找仍然是O(1),您不必费心从键中获取值当然,HashSet可能只是一个具有空值的HashMap,但您不必发明键和值