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”);
当我打印地图时,输出是{0=ssdfsd,1=ijk,2=def,3=abc,5=gfd,10=bcd}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很容易自己编写,因此每一
但是,即使我使用了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;
}