猿问

HashMap的keySet()顺序问题

每次都是 put 相同的值,那么 keySet 得到的 Key 的顺序都是固定的么?

我自己试的确是这样的,基本确定是固定的,看源码肯定更清楚了,自己懒。。。

我想这个 KeySet 顺序取决于 put 时散列值,这个散列值和什么相关呢,会不会换台机器或者换个 jdk 版本这个值就会有影响呢?


陪伴而非守候
浏览 358回答 1
1回答

白衣染霜花

put 源码:public V put(K key, V value) {&nbsp; &nbsp; if (key == null)&nbsp; &nbsp; &nbsp; &nbsp; return putForNullKey(value);&nbsp; &nbsp; int hash = hash(key.hashCode());&nbsp; &nbsp; int i = indexFor(hash, table.length);&nbsp; &nbsp; for (Entry<K,V> e = table[i]; e != null; e = e.next) {&nbsp; &nbsp; &nbsp; &nbsp; Object k;&nbsp; &nbsp; &nbsp; &nbsp; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; V oldValue = e.value;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.value = value;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.recordAccess(this);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return oldValue;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; modCount++;&nbsp; &nbsp; addEntry(hash, key, value, i);&nbsp; &nbsp; return null;}在 foreach 循环中,隐式调用的 nextEntry 源码:&nbsp; &nbsp; final Entry<K,V> nextEntry() {&nbsp; &nbsp; &nbsp; &nbsp; if (modCount != expectedModCount)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new ConcurrentModificationException();&nbsp; &nbsp; &nbsp; &nbsp; Entry<K,V> e = next;&nbsp; &nbsp; &nbsp; &nbsp; if (e == null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new NoSuchElementException();&nbsp; &nbsp; &nbsp; &nbsp; if ((next = e.next) == null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Entry[] t = table;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while (index < t.length && (next = t[index++]) == null)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; current = e;&nbsp; &nbsp; &nbsp; &nbsp; return e;&nbsp; &nbsp; }
随时随地看视频慕课网APP

相关分类

Java
我要回答