谨慎使用keySet:对于HashMap的2种遍历方式比较

HashMap存储的是键值对,所以一般情况下其遍历同List及Set应该有所不同.

但java巧妙的将HashMap的键值对作为一个整体对象(java.util.Map.Entry)进行处理,这优化了HashMap的遍历处理,使其遍历同List、Set并无差异.

第一种:

Java代码

  1. Map map = new HashMap();
  2. Iterator iter = map.entrySet().iterator();
  3. while (iter.hasNext()) {
  4. java.util.Map.Entry entry = (Map.Entry) iter.next();
  5. Object key = entry.getKey();
  6. Object val = entry.getValue();
  7. }

第二种:

Java代码

  1. Map map = new HashMap();
  2. Iterator iter = map.keySet().iterator();
  3. while (iter.hasNext()) {
  4. Object key = iter.next();
  5. Object val = map.get(key);
  6. }

例如: 

  HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的,下面请看实例:

Java代码

  1. public class HashMapTest {
  2.   public static void main(String[] args) ...{
  3.   HashMap hashmap = new HashMap();
  4.   for (int i = 0; i < 1000; i ) ...{
  5.       hashmap.put("" i, "that‘s all");
  6.   }
  7.   long num = Calendar.getInstance().getTimeInMillis();
  8.   Iterator iterator = hashmap.keySet().iterator();
  9.   while (iterator.hasNext()) ...{
  10.       System.out.print(hashmap.get(iterator.next()));
  11.   }
  12.   System.out.println();
  13.   System.out.println(Calendar.getInstance().getTimeInMillis() - num);
  14.   listHashMap();
  15.   }
  16.   public static void listHashMap() ...{
  17.         java.util.HashMap hashmap = new java.util.HashMap();
  18.   
  19. for (int i = 0; i < 1000; i ) ...{
  20.      hashmap.put("" i, "that‘s all");
  21.   }
  22.   long num = Calendar.getInstance().getTimeInMillis();
  23.   java.util.Iterator it = hashmap.entrySet().iterator();
  24.   while (it.hasNext()) ...{
  25.   java.util.Map.Entry entry = (java.util.Map.Entry) it.next();
  26.   // entry.getKey() 返回与此项对应的键
  27.   // entry.getValue() 返回与此项对应的值
  28.   System.out.print(entry.getValue());
  29.   }
  30.   System.out.println();
  31.   System.out.println(Calendar.getInstance().getTimeInMillis() - num);
  32.   }
  33.   }

看JDK源码,对比两种访问方式:

首先看KeySet访问方式:

Java代码

  1. public Set<K> keySet() {
  2. if (keySet == null) {
  3. keySet = new AbstractSet<K>() {
  4. public Iterator<K> iterator() {
  5. return new Iterator<K>() {
  6. private Iterator<Entry<K,V>> i = entrySet().iterator();
  7. public boolean hasNext() {
  8. return i.hasNext();
  9. }
  10. public K next() {
  11. return i.next().getKey();
  12. }
  13. public void remove() {
  14. i.remove();
  15. }
  16. };
  17. }
  18. public int size() {
  19. return AbstractMap.this.size();
  20. }
  21. public boolean contains(Object k) {
  22. return AbstractMap.this.containsKey(k);
  23. }
  24. };
  25. }
  26. return keySet;
  27. }

结论:

通过上边的测试我们可以看出,采用entrySet方式遍历效率要优于keySet,因此在开发中要使用entrySet,尽量避免少使用keySet。

时间: 2024-12-29 11:46:56

谨慎使用keySet:对于HashMap的2种遍历方式比较的相关文章

HashMap的两种遍历方式

HashMap存储的是键值对:key-value . java将HashMap的键值对作为一个整体对象(java.util.Map.Entry)进行处理,这优化了HashMap的遍历处理. 第一种:(只遍历一次,将key及value都放到entry中,效率高) Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { java.util.Map.Entry entry

HashMap的几种遍历方式

一.entrySet  键-值对集合 1.iterator Iterator item = tempMap.entrySet().iterator(); while (item.hasNext()){ Map.Entry entry = (Map.Entry)item.next(); String key = entry.getKey().toString(); Integer value =(Integer)entry.getValue(); System.out.println("key:&

HashMap概述及其三种遍历方式

一.HashMap概述: 1.HashMap是一个散列表,它存储的是键值对(key-value)映射: 2.HashMap继承AbstractMap,实现了Map,Cloneable,Serializable接口: 3.HashMap的实现不是同步的,线程不安全,但是效率高: 4.HashMap允许null键和null值,是基于哈希表的Map接口实现: 5.哈希表的作用是用来保证键的唯一性: 6.HashMap的实例有两个参数影响其性能:初试容量和加载因子,当哈希表中的条目数超出加载因子与当前容

android HashMap的几种遍历方法

HashMap的几种遍历方法 1.第一种: Map<String, ArrayList> map = new HashMap<String, ArrayList>(); Set<String> keys = map.keySet(); Iterator<String> iterator = keys.iterator(); while (iterator.hasNext()) { String key = iterator.next(); ArrayList

HashMap的四种遍历方法,及效率比较(简单明了)

https://yq.aliyun.com/ziliao/210955 public static void main(String[] args) { HashMap<Integer, String> map = new HashMap<Integer, String>(); for (int i = 0; i < 40000; i++) { map.put(i, "第" + i + "个"); } //循环第一种 long t1 =

HashMap的两种排序方式

Map<String, Integer> map = new HashMap<String, Integer>(); map.put("d", 2); map.put("c", 1); map.put("b", 1); map.put("a", 3); List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.

Map集合的几种遍历方式

Map<String ,String> map=new HashMap<String,String>(); map.put("1","value1"); map.put("2","value2"); map.put("3","value3"); //第一种遍历方式: for(String key:map.keySet()){ String key=key; Str

Map的两种遍历方式

********************************************************************************* *****************************Map两种遍历方式******************************* ********************************************************************************* 1 package ccms;

二叉树总结—建树和4种遍历方式(递归&amp;&amp;非递归)

今天总结一下二叉树,要考离散了,求不挂!二叉树最重要的就是 建立.4种遍历方式,简单应用,如何判断两颗二叉树是否相似 二叉树分为 :1.完全二叉树  2.满二叉树 结构性质: 1).满二叉树 高度为h ,节点数则为 2^h - 1,且叶子节点全在最下层,且叶子节点数为2^(n-1)个{n代表二叉树层数,也叫深度} 2).n个节点的 完全二叉树 深度为 int(log2n)(以2为底n的对数)+ 1: 3).非空二叉树 叶子节点个数==双分支节点数+1 4).非空二叉树 某节点编号 n  若有左孩