使用HashMap时,值和键在迭代时是否保证顺序相同?
时间:2020-03-06 14:40:17 来源:igfitidea点击:
当我遍历值或者键时,它们会关联吗?第二个键会映射到第二个值吗?
解决方案
这个问题起初使我感到困惑,但是@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
不,不一定。为此,我们实际上应该使用entrySet()。iterator()。使用此迭代器,我们将遍历Map中的所有Map.Entry对象,并可以访问每个键和关联的值。
values()和keySet()都委托给entrySet()迭代器,因此它们将以相同顺序返回。但是就像亚历克斯所说的那样,直接使用entrySet()迭代器要好得多。
使用@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 }
我们想使用LinkedHashMap作为可预测的迭代顺序
我第二个@basszero。尽管
for (Map.Entry<Integer, Integer> entry : a.entrySet())
会起作用,我发现使用自动执行此操作的数据结构会更好。现在,我们可以"正常"地进行迭代
HashMap的keySet方法返回一个Set,它不能保证顺序。
HashMap的values()方法返回一个Collection,它不能保证顺序。
就是说,问题是"它们是否要关联",因此从技术上讲,答案可能是,但不要依赖它。
我同意pmac72. 不要假设我们会从无序集合中获得有序的值或者键。如果不时地工作,那纯粹是危险。如果要保留订单,请使用LinkedHashMap或者TreeMap或者公共集合OrderedMap。
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