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)
如果是的话,请举一个小例子.
如果您没有找到相关问题,请在评论中提及,
你可以这样做,但在大多数情况下你不应该这样做.
映射的关键需要是常量,并且需要设置其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中的键的对象必须是常量的,否则你可能会"丢失"这些键.