Java hashmap如何使用整数作为键 Map m1=newhashmap(); m1.卖出(5,“gfd”); m1.put(1,“sandy”); m1.卖出(3,“abc”); m1.put(2,“def”); m1.put(1,“ijk”); m1.put(10,“bcd”); m1.put(0,“ssdfsd”);

Java hashmap如何使用整数作为键 Map m1=newhashmap(); m1.卖出(5,“gfd”); m1.put(1,“sandy”); m1.卖出(3,“abc”); m1.put(2,“def”); m1.put(1,“ijk”); m1.put(10,“bcd”); m1.put(0,“ssdfsd”);,java,Java,当我打印地图时,输出是{0=ssdfsd,1=ijk,2=def,3=abc,5=gfd,10=bcd} 但是,即使我使用了HashMap(),输出的排序顺序如何 AMap为您提供了将对象存储和检索到地图的界面,地图上附有一个键 每个实现在内部做什么完全取决于它,包括键/值对在内部结构中存储的顺序。请参阅@Seshoumaro的答案,以获取javadoc中的引用 HashMap对键(在本例中为整数)进行哈希运算,并将该哈希用作数组索引。由于Integer的hashCode很容易自己编写,因此每一

当我打印地图时,输出是{0=ssdfsd,1=ijk,2=def,3=abc,5=gfd,10=bcd}


但是,即使我使用了HashMap(),输出的排序顺序如何

A
Map
为您提供了将对象存储和检索到地图的界面,地图上附有一个键

每个实现在内部做什么完全取决于它,包括键/值对在内部结构中存储的顺序。请参阅@Seshoumaro的答案,以获取javadoc中的引用

HashMap
对键(在本例中为
整数)进行哈希运算,并将该哈希用作数组索引。由于Integer的hashCode很容易自己编写,因此每一个的数组索引与键本身的顺序相同也就不足为奇了


这意味着:HashMap以这种方式运行,您不应该感到惊讶。

HashMap不能保证存储项的顺序。在某些情况下,它甚至可能是有序的。摘自:

此类不保证地图的顺序;特别是,它不能保证订单在一段时间内保持不变


所以它按预期工作。如果您对这个特定示例的顺序感到好奇,您可以查看源代码本身。

它不仅限于整数键,您有时还可以通过字符串获得相同的结果。 它只是偶尔发生,你会发现许多相同的例子

正如其他人所建议的那样,HashMap在获取时从不保证插入顺序。因为官方文档说不要依赖,所以您可能会发现它在某些情况下无法保留顺序,因此更好的代码也是如此


有关更多信息,请参见。您可以在实现中轻松看到这一点。如果查看
HashMap.put()
的源代码,可以看到对象的哈希表索引是这样确定的:

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");
方法
hash()
indexFor()
只确保哈希值不会发生太多冲突,并且不会超过哈希表的长度

现在,如果查看
Integer.hashCode()
,您将看到散列就是整数本身:

int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
因此,值为
0
的整数将在哈希表的索引
0
中结束,依此类推。至少只要哈希表足够大

HashMap
toString()
方法迭代哈希表和哈希表每个索引中的元素。因此,在您的情况下,顺序是保留的


正如其他人正确提到的那样,
Map
的实现并不能保证这种行为。它只适用于这种特殊情况。

您可以自己查看源代码……不是每次都要运行三次,顺便说一句,在地图中添加更多元素肯定会有帮助show@HussainAkhtarWahid“Ghouri”:为什么它是不确定的?
public int hashCode() {
    return value;
}