`

EntrySet比KeySet效率高

    博客分类:
  • JAVA
阅读更多
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

/**
 * 测试keySet()与entrySet()的迭代时间
 * keySet():迭代后只能通过get()取key
 * entrySet():迭代后可以e.getKey(),e.getValue()取key和value。返回的是Entry接口
 * 最后说明下keySet()的速度比entrySet()慢了很多。看来以后要考虑用entrySet()了
 * @author YL
 * @date 2009.6.10
 */
public class HashMapTest 	
{
	public static void main(String[] args) 
	{
		HashMap<String,String> kmap = new HashMap<String,String>();
		HashMap<String, String> emap = new HashMap<String, String>();
		
		//装数据
		for (int i = 0; i < 1000; i++) 
		{
			kmap.put(""+i, "YL");
		}
		for (int i = 0; i < 1000; i++) 
		{
			emap.put(""+i, "ZT");
		}
		
		long stimes = System.currentTimeMillis();
		long ctimes = Calendar.getInstance().getTimeInMillis();
		long dtimes = new Date().getTime();
		
		//初始时间 这里我用了三种取值方式 最后发现System.currentTimeMillis();是最直接的取值方法
		System.out.println(stimes+"	"+ctimes+"	"+dtimes);
		
		Iterator<String> ktor = kmap.keySet().iterator();
		while(ktor.hasNext())
		{
			System.out.println(ktor.next());
		}
		
		long stimes1 = System.currentTimeMillis();
		long ctimes1 = Calendar.getInstance().getTimeInMillis();
		long dtimes1 = new Date().getTime();
		
		//结束世界并且也是entrySet的开始时间
		System.out.println((stimes1-stimes)+"	"+(ctimes1-ctimes)+"	"+(dtimes1-dtimes));
		System.out.println(stimes1+"	"+ctimes1+"	"+dtimes1);
		
		Iterator<Entry<String, String>> itor = emap.entrySet().iterator();
		while(itor.hasNext())
		{
			Entry<String, String> e = itor.next();
			//System.out.println(e.getKey());
			System.out.println(e.getValue());
		}
		
		long stimes2 = System.currentTimeMillis();
		long ctimes2 = Calendar.getInstance().getTimeInMillis();
		long dtimes2 = new Date().getTime();
		System.out.println(stimes2+"	"+ctimes2+"	"+dtimes2);
		System.out.println((stimes2-stimes1)+"	"+(ctimes2-ctimes1)+"	"+(dtimes2-dtimes1));
	}
}

 

1、基本概述

Set<Map.Entry<K,V>> entrySet()  返回此映射中包含的映射关系的 set 视图。

Set<K>              keySet()      返回此映射中包含的键的 set 视图。

2、效率分析

对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。而entryset只是遍历了第一次,他把key和value都放到了entry中,所以就快了。

3、使用举例

Map<String, String> maps = new HashMap<String, String>();  
  //方法一: 用entrySet()  
  Iterator<Entry<String,String>> it = maps.entrySet().iterator();  
  while(it.hasNext()){  
   Map.Entry<String,String> m = it.next();  
   String key = m.getKey();
   String value= m.getValue();
  }  
  // 方法二:jdk1.5支持,用entrySet()和For-Each循环()  
  for (Map.Entry<String, String> m : maps.entrySet()) {  
   String key = m.getKey();
   String value= m.getValue();   
  }  
  // 方法三:用keySet()  
  Iterator<String> it2 = maps.keySet().iterator();  
  while (it2.hasNext()){  
   String key = it2.next();
   String value= maps.get(key);
  }  
  // 方法四:jdk1.5支持,用keySet()和For-Each循环  
  for(String m: maps.keySet()){  
   String key = m;
   String value= maps.get(m);
  }

foreach和while的效率几乎是差不多的,而for则相对较慢一些。foreach可以替代掉for吗?显然不是。
foreach的内部原理其实还是 Iterator,但它不能像Iterator一样可以人为的控制,而且也不能调用iterator.remove(),更不能使用下标来方便的访问元素。因此foreach这种循环一般只适合做数组的遍历,提取数据显示等,不适合用于增加删除和使用下标等复杂的操作。

分享到:
评论

相关推荐

    集合嵌套集合并用迭代器输出,有关keySet()和entrySet()的练习

    此文件是用eclipse打包的,如果用eclipse工具可直接导入查看,如果用的是idea工具,可以打开bin下的.class文件之后,拖入到idea运行即可

    自定义MyHashMap集合及entrySet()实现.md

    用自定义的MyHashMap彻底了解EntrySet ()方法,及put()和get()方法实现

    Java Map遍历方式的选择

     对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多。理由是:entrySet方法一次拿到所有key和value的集合;而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次...

    ist的matlab代码-uebung05:练习05

    是的matlab代码在事件中锻炼。 数据结构 在本练习中,我们使用Java API提供的List , Set和Map数据结构。 此外,已经实现了ueb05.CorpusReader类,它提供了一个静态方法...keySet和values提供Collections 。 可以使用C

    Java使用entrySet方法获取Map集合中的元素

    主要为大家详细介绍了Java使用entrySet方法获取Map集合中的元素,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    java遍历特例

    Iterator it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); Object key = entry.getKey(); Object value = entry.getValue(); } Map map =...

    java map集合

    NULL 博文链接:https://hoochiang.iteye.com/blog/1816970

    java中Map集合的常用遍历方法及HashMap的应用实例

    1、遍历Map.entrySet():它的每一个元素都是Map.Entry对象,这个对象中, 放着的就是Map中的某一对key-value; 2、遍历Map.keySet():它是Map中key值的集合,我们可以通过遍历这个集合来 读取Map中的元素; 3、...

    HashMap 概述 精讲 .md

    - KeySet 内部类 - Values 内部类 - EntrySet 内部类 - HashMap 1.7 的底层结构 - HashMap 1.8 的底层结构 - HashMap 重要属性 - HashMap 构造函数 - 讲一讲 HashMap put 的全过程 - Hash 函数 - 扩容机制...

    金陵科技学院软件院大二上Java高级1212Map.docx

    1212Map.doc 目的: 学会使用 Map、TreeMap 完成内容 1. 定义 Map, 加入一些数据 使用 entrySet 方式显示全部键、值其内容 使用 keySet 方式显示全部键、值内容 使用 values 显示全部值内容

    Android代码-ikvStockChart

    Features 当前最新版本:0.1.5 支持在 XML 布局文件和代码中设置各个线条颜色、大小配置 支持左滑、右滑加载 ...支持 fling 滑动 支持 MACD、RSI、KDJ、BOLL 四个... final EntrySet entrySet = new EntrySet(); entrySet

    怎样遍历一个HashMap?

    &lt;br&gt;for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) { &lt;br&gt; Map.Entry entry = (Map.Entry) iter.next(); &lt;br&gt; Object key = entry.getKey(); &lt;br&gt; Object val = entry.getValue()...

    pageDate封装参数,不用实体类

    Iterator entries = properties.entrySet().iterator(); Entry entry; String name = ""; String value = ""; while (entries.hasNext()) { entry = (Entry) entries.next(); name = (String) entry.get...

    android控件监听管理工具

    for(Map.Entry,Object&gt; entry:data.entrySet()){ View v = (View) entry.getKey(); v.setOnClickListener(null); } } private void registerLisntener(){ for(Map.Entry,Object&gt; entry:data.entrySet...

    java循环Map java迭代Map

    Iterator it = a.entrySet().iterator(); while (it.hasNext()) { Map.Entry pairs = (Map.Entry) it.next(); System.out.println(pairs.getValue()); } //以下方法需要jdk5以上支持 //方法二 for(String str:...

    java桑硅谷 day23 晨考.zip

    Set, ArrayList&lt;City&gt;&gt;&gt; entrySet=map.entrySet(); for (Entry, ArrayList&lt;City&gt;&gt; entry : entrySet) { System.out.println(entry.getKey()); ArrayList&lt;City&gt; value = entry.getValue(); for (City ...

    Java容器.xmind

    Set,V&gt;&gt; entrySet​() 线程不安全,速度快,允许存放null键,null值。 SortedMap 标记: class TreeMap 对键进行排序 HashTable 标记: class Properties 标记: class 线程安全,速度慢,不允许存放null键,...

    sesvc.exe 阿萨德

    看似要比 1.7 的复杂,我们一步步拆解: 判断当前桶是否为空,空的就需要初始化(resize 中会判断是否进行初始化)。 根据当前 key 的 hashcode 定位到具体的桶中并判断是否为空,为空表明没有 Hash 冲突就直接在...

    模拟实现购物车功能

    Set, Integer&gt;&gt; entrySet = map.entrySet(); System.out.println("编号\t单价\t数量\t名称\t总价"); for(Entry, Integer&gt; entry:entrySet){ Goods goods = entry.getKey(); Integer quantity = entry.getValue...

    模拟购物车

    Set, Integer&gt;&gt; entrySet = map.entrySet(); System.out.println("编号\t单价\t数量\t名称\t总价"); for(Entry, Integer&gt; entry:entrySet){ Goods goods = entry.getKey(); Integer quantity = entry.getValue...

Global site tag (gtag.js) - Google Analytics