使用HashMap迭代时,键和值是否保证按相同顺序排列?

9
当我迭代值或键时,它们是否会相关联?第二个键是否映射到第二个值?
9个回答

14

不一定。您应该真正使用entrySet().iterator()来实现此目的。有了这个迭代器,您将遍历Map中的所有Map.Entry对象,并可以访问每个键和关联值。


8

要使用@Cuchullain提到的entrySet:

Map<String, String> map = new HashMap<String, String>();

// populate hashmap

for (Map.Entry<String, String> entry : map.entrySet()) {
  String key = entry.getKey();
  String value = entry.getValue();
  // your code here
}

7
你想使用这个 LinkedHashMap 来保证迭代顺序可预测。

如果您需要一个确定性排序的集合,可以使用LinkedHashSet。 - ivan_ivanovich_ivanoff

4
public class Test {
 public static void main(String[] args) {
  HashMap <String,String> hashmap = new HashMap<String,String>();
  hashmap.put("one", "1");
  hashmap.put("two", "2");
  hashmap.put("three", "3");
  hashmap.put("four", "4");
  hashmap.put("five", "5");
  hashmap.put("six", "6");

  Iterator <String> keyIterator   = hashmap.keySet().iterator();
  Iterator <String> valueIterator = hashmap.values().iterator();

  while(keyIterator.hasNext()) {
   System.out.println("key: "+keyIterator.next());
  }

  while(valueIterator.hasNext()) {
   System.out.println("value: "+valueIterator.next());
  }
 }
}

key: two
key: five
key: one
key: three
key: four
key: six
value: 2
value: 5
value: 1
value: 3
value: 4
value: 6

2

values()和keySet()方法都委托给entrySet()迭代器,因此它们返回的顺序相同。但正如Alex所说,直接使用entrySet()迭代器会更好。


这是一个实现细节。我不认为有任何保证这是正确的。 - Alex Miller

1

我同意pmac72的观点。不要假设您会从无序集合中获得有序的值或键。如果有时可以正常工作,那只是纯粹的巧合。如果想要保留顺序,请使用LinkedHashMap或TreeMap或commons collections OrderedMap。


0

HashMap的keySet方法返回一个Set,它不保证顺序。
HashMap的values()方法返回一个Collection,它不保证顺序。

话虽如此,问题是“它们是否会相关”,所以从技术上讲答案可能是,但不要依赖它。


0

一开始这个问题让我感到困惑,但是@Matt为我解答了。

考虑使用entrySet()方法,该方法返回Map中键值对的集合。

Map<Integer, Integer> a = new HashMap<Integer, Integer>(2);
a.put(1, 2);
a.put(2, 3);
for (Map.Entry<Integer, Integer> entry : a.entrySet()) {
    System.out.println(entry.getKey() + " => " + entry.getValue());
}

这将输出:

1 => 2
2 => 3
3 => 3

我一开始也以为问题是这样的,但听起来他正在使用.keys()和.values()方法分别迭代键和值。在这种情况下,我不认为LinkedHashMap可以解决这个问题。 - Matt
另外,您不应该创建与预期元素数量相同大小的HashMap。 HashMap具有通常为75%的负载因子。这意味着如果地图已经填充了75%并且您添加了一个元素,则会增加其大小。 - Roel Spilker

0

我同意@basszero的观点。虽然

for (Map.Entry<Integer, Integer> entry : a.entrySet()) 

这样做是可行的,但我发现使用自动完成此操作的数据结构更好。现在,您可以正常迭代。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接