HashMap键的迭代顺序是否相同

时间:2015-07-09 08:41:28

标签: java hashmap

我想知道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  

4 个答案:

答案 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实现。地图已排序   根据其键的自然顺序,或由比较器   在地图创建时提供,具体取决于使用的构造函数。