hashmap如何与Integer一起使用作为键

时间:2014-09-23 07:55:26

标签: java

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(),输出如何按排序顺序排列?

4 个答案:

答案 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的实现无法确保这种行为。它只适用于这种特殊情况。