我想知道HashMap在添加记录后每次迭代都会给出相同的密钥序列。
我正在使用以下代码
HashMap<String,String> mapObj=new HashMap<String,String>();
mapObj.put("a", "aValue");
mapObj.put("b", "bValue");
mapObj.put("c", "cValue");
for(String key:mapObj.keySet()){
System.out.println(key+" :: "+mapObj.get(key));
}
for(String key:mapObj.keySet()){
System.out.println(key+" :: "+mapObj.get(key));
}
以下程序的输出是
b :: bValue
c :: cValue
a :: aValue
b :: bValue
c :: cValue
a :: aValue
答案 0 :(得分:3)
如果您不对两次迭代之间的HashMap
进行任何更改,您可能会看到相同的迭代顺序(即使它不能保证),因为这是一个确定性的数据结构。但是,在两次迭代之间添加或删除条目可能会改变迭代顺序。
如果您想依赖迭代顺序,请使用LinkedHashMap,其中(默认情况下)按照首次添加到Map的顺序迭代键。
如果要以某种特定顺序迭代键,则可以使用TreeMap(其中键按照其自然顺序或提供的Comparator进行排序)。
答案 1 :(得分:1)
哈希映射接受要存储为对象的对象 生成一个独特的数字。
HashMap使用散列来存储hashmap中的条目,因此没有保证会按特定顺序显示。如果您希望订购HashMap中的条目,则必须对其进行排序,或者您可以使用Treemap
答案 2 :(得分:0)
HashMap
没有维持订单。如果您希望按顺序检索元素,那么最好使用LinkedHashMap
。
答案 3 :(得分:0)
通常,如果迭代顺序针对多个后续调用而更改(假设地图本身之间没有变化),那就不足为奇了。 但是你不应该依赖它,因为API不能保证这一点。
根据doc:
Map界面提供了三个集合视图,允许使用地图 要被视为一组键,值集合或集合的内容 键值映射。地图的顺序定义为顺序 哪个迭代器在地图的集合视图中返回它们 元素。一些地图实现,如TreeMap类,make 对其订单的具体保证;其他人,比如HashMap 上课,不要。
根据Java Doc,您可以使用LinkedHashMap
作为其entrySet
维护插入顺序:
这个实现与HashMap的不同之处在于它维护了一个 贯穿其所有条目的双向链表。这有联系 list定义迭代排序,通常是顺序 哪些键被插入到地图中(插入顺序)。
TreeMap保持键的自然顺序。
基于红黑树的NavigableMap实现。地图已排序 根据其键的自然顺序,或由比较器 在地图创建时提供,具体取决于使用的构造函数。