是从HashMap中检索值的顺序的插入顺序
我想弄清楚HashMap中的值的顺序是可以被检索的。 下面的代码片段相同。
import java.util.HashMap; public class HashMapExample { public static void main(String[] args) { HashMap<Integer, String> hashmap = new HashMap<Integer, String>(); hashmap.put(1, "apple" ); hashmap.put(2, "lemon" ); hashmap.put(3, "orange" ); hashmap.put(4, "banana" ); hashmap.put(5, "litchi" ); hashmap.put(6, "mango" ); hashmap.put(7, "papaya" ); System.out.println(hashmap.size()); for (String key : hashmap.values()) { System.out.println(key); } } }
输出:
7 apple lemon orange banana litchi mango papaya
这些值将按照插入的顺序进行打印。 这是真的吗? 我期待的价值是以任意的顺序印刷。 这是使用Java 6。
这些值将按照插入的顺序进行打印。 这是真的吗? 我期待的值是随机的顺序打印。
HashMap
API不定义迭代顺序。
但是,如果查看HashMap的实现,则可以推断迭代顺序,键的哈希值,键的插入顺序以及哈希表的大小之间存在复杂的瞬态关系。 如果哈希表调整自己的大小,这个关系就会被搅乱。
在你的情况下,你使用的是Integer
键,这意味着键的哈希值是键值本身。 此外,您按键顺序插入条目。 这会导致(偶然!)到与插入顺序匹配的迭代顺序。 但是,如果你不断插入更多的键,你会发现迭代顺序“环绕”。 然后,随着桌子经过一系列的调整,顺序将逐渐变得越来越混乱。
简而言之,你所看到的是散列表实现的人造物,而不是你可以(或应该)明智地使用的东西。
从Javadoc: HashMap
“类不能保证地图的顺序;特别是,它不能保证顺序会随着时间的推移保持不变。
如果您需要一致的sorting,可以使用LinkedHashMap
(用于插入/访问顺序)或TreeMap
(用于比较顺序)。 请注意,这些维护键的顺序,而不是值。
一个LinkedHashMap就是你所追求的。 从doco中,它与HashMap的不同之处在于,它维护一个双向链表,在其所有条目中运行
如果顺序很重要,请尝试LinkedHashMap …请参阅JavaDoc
公共类LinkedHashMap扩展了HashMap
哈希表和Map接口的链表实现,具有可预测的迭代顺序。 这个实现与HashMap的不同之处在于它维护着一个双向链表,它通过所有的条目运行。 这个链表定义了迭代sorting,通常是键被插入映射的顺序(插入顺序)。 请注意,如果将键重新插入到地图中,则插入顺序不受影响。 (如果m.containsKey(k)在调用之前立即返回true,则调用m.put(k,v)时,将密钥k重新插入到映射m中。
相关的集合是java.util.concurrent的ConcurrentSkipListMap 。 跳过列表允许您按照键顺序遍历条目,并以随机顺序查找它们(但不像HashMap那么快)。
有一个不错的跳过列表演示程序 。