我们可以将嵌套地图作为其他地图中的关键字吗?

sag*_*gar 1 java collections hashmap map treemap

我刚刚开始在Java中实现数据结构,并且想知道我们可以有这样的情况.

Map<HashMap<String,String>,String> map = new HashMap<HashMap<String,String>,String>(); 
Run Code Online (Sandbox Code Playgroud)

如果是的话,请举一个小例子.

如果您没有找到相关问题,请在评论中提及,

Tim*_*m B 5

可以这样做,但在大多数情况下你不应该这样做.

映射的关键需要是常量,并且需要设置其equals和hashcode以提供正确的行为.如果在将密钥添加到地图后修改密钥,则会使地图无效.

可以修改HashMap,因此不应将其用作键.

要解释为什么更改它是一个问题,您需要知道hashmaps如何工作.这是非常简化的,但是假设你有一个HashMap H包含两个桶.让我们称他们为B0和B1.

每当你添加ObjectHashMap它着眼于对象hashCode.如果最后一位为0则进入B0,如果为1,则进入B1.

现在,在查找对象时,它会查看hashCode并立即转到右侧存储桶,然后只需搜索该存储桶中的对象即可找到所需的对象.

通过使用更多的桶而不仅仅是2,您可以将每个桶中的项目数减少2,4,8或更多次,从而减少需要检查的对象数量.

但是,假设您将一个对象放入地图中,并将其添加到B0中.然后更改对象并更改hashCode,使最后一位为1.

如果你这样做,map.contains(obj)你会得到结果为假,因为它将查看hashCode,直接跳转到B1并仅扫描该对象.但是对象被置于B0中,因为这是hashCode插入时的内容.

这就是为什么hashCode对于任何被用作HashMap中的键的对象必须是常量的,否则你可能会"丢失"这些键.