Map<Integer,String> m1 = new HashMap<>();
m1.put(5, "gfd");
m1.put(1,"sandy");
m1.put(3, "abc");
m1.put(2, "def");
m1.put(1, "ijk");
m1.put(10, "bcd");
m1.put(0, "ssdfsd");
当我打印地图时,输出为{0 = ssdfsd,1 = ijk,2 = def,3 = abc,5 = gfd,10 = bcd}。
但是,即使我使用了HashMap(),输出如何按排序顺序排列?
答案 0 :(得分:0)
Map
为您提供了将对象存储和检索到地图中的接口,并附有一个键。
每个实现在内部完成的工作完全取决于它,包括键/值对以何种顺序存储在内部结构中。有关javadoc的引用,请参阅@ Seshoumaro的答案。
HashMap
哈希键(在这种情况下为Integer
)并将该哈希用作数组索引。由于Integer的hashCode编写起来相当简单,因此每个数组的索引与键本身的顺序相同并不奇怪。
这意味着什么:HashMap
以这种方式行事,你不应该感到惊讶。
答案 1 :(得分:0)
HashMap无法保证所存储项目的顺序。在某些情况下,它甚至可以 。取自javadoc:
此课程不保证地图的顺序;特别是,它不保证订单会随着时间的推移保持不变。
所以它按预期工作。如果您对为什么这个特定示例按顺序排列很好奇,您可以查看源代码本身。
答案 2 :(得分:0)
它不仅限于整数键,有时你也可以使用字符串获得相同的键。 它恰好恰好有时会发现很多相同的实例。
正如其他人所建议的那样,HashMap在获取时永远不会保证插入顺序。由于官方文档说不依赖,你可能会发现它不会保留订单的情况,所以更好的代码同样如此。
有关详情,请参阅this
答案 3 :(得分:0)
您可以在实施中轻松看到这一点。如果查看HashMap.put()
的源代码,可以看到对象的哈希表索引是这样确定的:
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
方法hash()
和indexFor()
仅确保哈希值没有太多冲突,并且它们不会超过哈希表的长度。
现在,如果您查看Integer.hashCode()
,您会看到哈希是整数本身:
public int hashCode() {
return value;
}
因此,具有值0
的整数最终会出现在哈希表的索引0
中,依此类推。至少只要哈希表足够大就可以了。
toString()
HashMap
方法迭代哈希表和哈希表的每个索引中的元素。所以在你的情况下,订单会被保留。
正如其他人正确提到的那样,Map
的实现无法确保这种行为。它只适用于这种特殊情况。