我刚刚开始在Java中实现数据结构,并且想知道我们是否会遇到这样的情况。
Map<HashMap<String,String>,String> map = new HashMap<HashMap<String,String>,String>();
如果是的话,请举一个小例子。
如果您未发现相关问题,请在评论中提及
答案 0 :(得分:5)
你可以这样做,但在大多数情况下你不应该这样做。
映射的关键点必须是常量,并且需要设置其equals和hashcode以提供正确的行为。如果在将密钥添加到地图后修改密钥,则会使地图无效。
可以修改HashMap,因此不应将其用作密钥。
要解释为什么更改它是一个问题,您需要知道hashmaps的工作原理。这是非常简化的,但是假设您有一个HashMap H
包含两个存储桶。让我们称它们为B0和B1。
每当您向Object
添加HashMap
时,它都会查看对象hashCode
。如果最后一位为0则进入B0,如果为1,则进入B1。
现在,在查找对象时,它会查看hashCode
并立即转到右侧存储桶,然后只需搜索该存储桶中的对象即可找到所需的对象。
通过使用更多的桶而不仅仅是2,您可以将每个桶中的项目数减少2,4,8或更多次,从而减少需要检查的对象数量。
但是,假设您将一个对象放在地图中并将其添加到B0中。然后更改对象并更改hashCode,使最后一位为1。
如果你执行map.contains(obj)
,你会得到错误的结果,因为它会查看hashCode,直接跳转到B1并只扫描该对象。但是对象被放置在B0中,因为这是hashCode插入时的内容。
这就是为什么hashCode对于任何被用作HashMap中的键的对象必须是常量的,否则你可能会失去&#34;这些钥匙。
答案 1 :(得分:1)
HashMap<String, String> map = new HashMap<String, String>();
HashMap<HashMap<String, String>, String> tMap = new HashMap<HashMap<String, String>, String>();
map.put("1", "one");
map.put("2", "two");
tMap.put(map, "numbers");
//for getting the value
Set description = tMap.entrySet();
使用Iterator迭代hashmap值的值 根据您的需要实现此类功能,否则不建议使用。
答案 2 :(得分:0)
您不能将地图用作关键字,但可以将其用作值。
为了进一步解释,由于您可能会添加到HashMap,因此密钥将不会保持不变,因此将不再用作密钥的目的。
答案 3 :(得分:0)
如其他答案中所述,HashMap
不应用作地图键,因为它是可变的,但是像Guava的ImmutableMap这样的不可变地图也可以使用。