为什么HashMap有时会以自然顺序打印

arj*_*ani 2 java hashmap

我正在阅读Java中的Hash Map,我发现Hash Maps是无序的和未排序的.因此,在打印使用时,我们应该以键的任意顺序获取映射System.out.println(HM).例如,以下代码

HashMap<Integer,String> HM = new HashMap<>();
HM.put(16,"hello16");
HM.put(6, "hello6");
HM.put(1, "hello1");
Run Code Online (Sandbox Code Playgroud)

打印{16=hello16, 1=hello1, 6=hello6}这是一个明显随机的键序.但是当我替换HM.put(16,"hello16");with时HM.put(15,"hello15");,它会按键的自然顺序打印映射,这是令人惊讶的,似乎不太可能:

{1=hello1, 6=hello6, 15=hello15}
Run Code Online (Sandbox Code Playgroud)

我问了一位朋友,他说这与HashMap的初始容量(= 16)有关,但他无法清楚地解释.任何人都可以用这个特定的例子解释输出中的这种差异.

Daw*_*ica 8

hashCodeInteger是本身的价值.您HashMap有16个桶,这意味着分配值的桶key % 16是0到15之间的数字.

如果您的密钥在0到15范围内,则桶号密钥.当你使用钥匙> 15或钥匙时,事情就会变得混乱< 0.

打印a时HashMap,条目按桶顺序显示.也就是说,如果有的话,首先打印桶0中的密钥; 然后在桶1中的一个键,依此类推.在你的情况下HashMap,所有的按键都为0到15之间,这是完全一样的键顺序.