Map遍历的四种方法
来源:互联网 发布:网络侵犯名誉权起诉状 编辑:程序博客网 时间:2024/04/28 00:43
package cn.com.collection;import java.util.HashMap;import java.util.Iterator;import java.util.Map;/*** @author water* @version 创建时间:2016年9月12日 下午4:02:42* 类说明*/public class TestMap {public static void main(String[] args) {// TODO Auto-generated method stubMap map = new HashMap(1000);for(int i=0;i<1000;i++){map.put(i+"", "str"+i);}// 方法一、推荐只用value的时候用// Map.values()遍历所有的value,不遍历key for (Object v : map.values()) { System.out.println("value= " + v); } //推荐只用keys的时候用for(Object key : map.keySet()){ System.out.println("key= "+ key ); }//方法二:取二次值,先取key再取value,建议只需要用key的时候使用,节省时间、空间 for(Object key : map.keySet()){ System.out.println("key= "+ key + " and value= " + map.get(key)); }//方法三:取一次值,一次把key和value全部取出 //entrySet使用iterator遍历key和value Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, String> entry = it.next(); System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); } // 四、推荐,尤其是容量大时,TreeMap尤其推荐 // entrySet遍历key和value for (Object obj : map.entrySet()) { Map.Entry entry = (Map.Entry) obj; System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); } }}
比较keySet和EntrySet性能
package cn.com.collection;import java.util.HashMap;import java.util.Map;import java.util.TreeMap;/** * @author gaohuashui * @version 创建时间:2016年9月12日 下午4:20:18 类说明 */public class TestMap2 {public static void main(String[] args) {Map map = new HashMap(1000000);//Map map = new TreeMap();for (int i = 0; i < 1000000; i++) {map.put(i + "", "str" + i);}// 二次取值long current = System.currentTimeMillis();for (Object key : map.keySet()) {map.get(key);}System.out.println("keySet cost time : "+String.valueOf(System.currentTimeMillis() - current));// entrySet遍历key和valuelong current1 = System.currentTimeMillis();for (Object obj : map.entrySet()) {Map.Entry entry = (Map.Entry) obj;entry.getKey();entry.getValue();}System.out.println("entrySet cost time : "+String.valueOf(System.currentTimeMillis() - current1));}}执行以上代码,结果:
keySet cost time : 52
entrySet cost time : 33
由结果我们发现,entrySet 的效率高于keySet。同时遍历key和value时,keySet与entrySet方法的性能差异取决于key的具体情况,如复杂度(复杂对象)、离散度、冲突率等。换言之,取决于HashMap查找value的开销。entrySet一次性取出所有key和value的操作是有性能开销的,当这个损失小于HashMap查找value的开销时,entrySet的性能优势就会体现出来。当key是最简单的数值字符串时,keySet可能反而会更高效,在我的例子中没有测出,总体来说还是推荐使用entrySet。因为当key很简单时,其性能或许会略低于keySet,但却是可控的;而随着key的复杂化,entrySet的优势将会明显体现出来。当然,我们可以根据实际情况进行选择。
当我们将HashMap换成TreeMap时,我们发现EntrySet的效率大大地高出了KeySet。这是由TreeMap的查询效率决定的,也就是说,TreeMap查找value的开销较大,明显高于entrySet一次性取出所有key和value的开销。因此,遍历TreeMap时强烈推荐使用entrySet方法。
当然在使用过程中,如果只需要key时,我们选择keySet,如果只使用Value时,我们使用Values取出值即可。
0 0
- java Map 遍历的四种方法
- 遍历Map的四种方法
- 遍历Map的四种方法
- 遍历Map的四种方法
- java 遍历Map的四种方法
- 遍历Map的四种方法
- 遍历Map的四种方法
- 遍历Map的四种方法
- 遍历Map的四种方法
- 遍历Map的四种方法
- 遍历Map的四种方法
- 遍历Map的四种方法
- 遍历Map的四种方法
- 遍历Map的四种方法
- 遍历Map的四种方法
- 遍历Map的四种方法
- 遍历Map的四种方法
- java遍历Map的四种方法
- 关于我在github上Sara项目的介绍
- Android如何防止apk程序被反编译
- node.js学习路线图
- scrollView 设置多个控件的方法
- 错误信息:响应消息的内容类型 text/html; charset=utf-8 与绑定(text/xml; charset=utf-8)的内 容类型不匹配
- Map遍历的四种方法
- 返回顶部代码编写
- Android中的硬件加速
- HandlerThread的使用方法和原理
- VC++开发的ActiveX如何加入安全机制,避免IE中提示“在此页上的ActiveX控件和本页上的其他部分的交互可能不安全,你想允许这种交互吗?”
- java:从消息机制谈到观察者模式
- POJ 2031 Building a Space Station
- 深入理解变量声明提升和函数声明提升
- [leetcode] 258. Add Digits