Java哈希映射会自动排序


import java.util.Map;
import java.util.HashMap;
import java.util.Collection;
public class Main
{
public static void main(String[] args) {

Map<String, String> map = new HashMap<String, String>();

map.put("Str1", "value1");
map.put("Str2", "value2");
map.put("Str3", "value3");
map.put("Str4", "value4");
map.put("Str5", "value5");

System.out.println(map.entrySet());

Collection<String> values = map.values();
String[] arr = values.toArray(new String[0]);
System.out.println(arr[3]);
}
}

我知道Hashmap没有顺序,但这段代码一直在显示[Str5=value5,Str4=value4,Str3=value3,Str2=value2,Str1=value1]值2我缺少什么吗?

这是String.hashCode()如何实现的一个假象。

添加此代码:

System.out.println(map.entrySet());

for(Map.Entry<String,String> curr : map.entrySet()){
String str=curr.getValue();
System.out.println(str+" "+str.hashCode());
}

典型输出:

value5 -823812892
value4 -823812893
value3 -823812894
value2 -823812895
value1 -823812896

等一下!那些散列码是连续的。仅仅因为散列码是"任意的"并不意味着它没有结构

事实证明,标准实现是以"乘加"计算的(其中h是散列码(:

for (int i = 0; i < chars.length; i++) {
h = 31 * h + chars[i];
}

因为这些字符串只在最后一个字符上不同,而且这个字符在它们之间是连续的,所以哈希代码是按顺序出现的。

最后一个字符的效果只是一个加法。

排序不是哈希代码的预期属性。这只是价值观下降的方式。

此外,这意味着这些字符串被放入哈希表的方式也是巧合的。因此,当条目以任意顺序(但在实践中"恰好是"(迭代时,它们的顺序如图所示。

这种有序的结果纯属偶然。再加上更多的值,这种模式最终就会打破。有关如何实现HashMap的更多详细信息,请参阅建议的"重复"答案。

最新更新