Whi*_*ing 0 java collections dictionary hashmap
我创建了一个带有内部地图的地图作为测试,看起来外部地图将忽略其余的地图。我认为它会压倒他们。我还认为这是因为它们都是从 Map 扩展的,所以当它们不是时,它将它们视为同一个实例。
Map<Map<Integer, String>,String> maps=new HashMap<>();
maps.put(new HashMap<Integer, String>(),"HashMap");
maps.put(new TreeMap<Integer, String>(),"TreeMap");
maps.put(new LinkedHashMap<Integer, String>(),"LinkedHashMap");
maps.put(new Hashtable<Integer, String>(),"Hashtable");
Run Code Online (Sandbox Code Playgroud)
将地图打印到日志将仅显示最后添加的地图:
maps: {{}=Hashtable}
Run Code Online (Sandbox Code Playgroud)
我尝试了其他 Map 实现,除了 TreeMap 之外,所有实现都具有相同的行为,由于 HashMap 没有实现,它会抛出异常Comparable。
这是预期的行为吗?为什么 HashMap 会有这样的行为?
当我们查看 的文档Map::equals时,我们看到这个方法
true如果给定对象也是一个映射并且两个映射表示相同的映射,则返回。更正式地说,如果 ,两个映射m1和m2表示相同的映射m1.entrySet().equals(m2.entrySet())。
由于和之间的合同Object::equalsObject::hashCode,这意味着这些映射也将具有相同的哈希码。反过来,这意味着它们是Map::put无法区分的。因此,put(...)示例程序中的每个都会覆盖前一个put,从而导致最终的地图大小为 ,1其中仅HashTable包含entrySet()。
所以是的,这是预期的行为。它不仅适用于HashMap,而且适用于所有Map实现。
正如Pshemo的评论中已经指出的那样,使用 a作为另一个的键是有问题的,一般来说,我们应该使用不可变对象作为键。MapMap