Java之Map遍历方式性能分析:ketSet与entrySet

keySet():将Map中所有的键存入到Set集合中。因为set具备迭代器,所以可以以迭代方式取出所有的键,再根据get方法获取每一个键对应的值,其仅能通过get()取key。

entrySet(): 返回此映射中包含的映射关系的 Set 视图,格式为Set<Map.Entry<K,V>>, Map.Entry表示映射关系,迭代后可以e.getKey()、e.getValue()取key和value,返回的是Entry接口 。

keySet()方式

Set<String> keySet = map.keySet();//先获取map集合的所有键的Set集合Iterator<String> it = keySet.iterator();//有了Set集合,就可以获取其迭代器while (it.hasNext()) {    String key = it.next();String value = map.get(key);//有了键可以通过map集合的get方法获取其对应的值。}

entrySet()方式:

//通过entrySet()方法将map集合中的映射关系取出(这个关系就是Map.Entry类型)Set<Map.Entry<String, String>> entrySet = map.entrySet();//将关系集合entrySet进行迭代,存放到迭代器中Iterator<Map.Entry<String, String>> it2 = entrySet.iterator();while (it2.hasNext()) {    Map.Entry<String, String> me = it2.next();//获取Map.Entry关系对象meString key2 = me.getKey();//通过关系对象获取keyString value2 = me.getValue();//通过关系对象获取value}

性能测试:

public static void main(String[] args) {    HashMap<String, String> keySetMap = new HashMap<String, String>();HashMap<String, String> entrySetMap = new HashMap<String, String>();    for (int i = 0; i < 100000; i++) {        keySetMap.put("" + i, "keySet");entrySetMap.put("" + i, "entrySet");}long startTimeOne = System.currentTimeMillis();Iterator<String> keySetIterator = keySetMap.keySet().iterator();    while (keySetIterator.hasNext()) {        String key = keySetIterator.next();String value = keySetMap.get(key);System.out.println(key + "," + value);}    System.out.println("keyset spent times:" + (System.currentTimeMillis() - startTimeOne));

    long startTimeTwo = System.currentTimeMillis();Iterator<Map.Entry<String, String>> entryKeyIterator = entrySetMap.entrySet().iterator();    while (entryKeyIterator.hasNext()) {        Map.Entry<String, String> e = entryKeyIterator.next();System.out.println(e.getKey() + "," + e.getValue());}    System.out.println("entrySet spent times:" + (System.currentTimeMillis() - startTimeTwo));}

运行结果如下所示,keySet()比entrySet()慢很多。

原因分析:采用keySet方式时, 注释掉keySetMap.get(key)后性能一致。如下图所示,也就是说通过keySet方式获取value时又重新遍历Map集合,损耗了性能。因此不建议采用keySet方式获取value。

来自为知笔记(Wiz)

时间: 2024-10-22 21:14:40

Java之Map遍历方式性能分析:ketSet与entrySet的相关文章

Arraylist、Linkedlist遍历方式性能分析

本文主要介绍ArrayList和LinkedList这两种list的常用循环遍历方式,各种方式的性能分析.熟悉java的知道,常用的list的遍历方式有以下几种: 1.for-each List<String> testList = new ArrayList<String>(); for (String tmp : testList) { //use tmp; } 这种遍历方式是最常用的遍历方式,因为书写比较方便,而且不需要考虑数组越界的问题,Effective-Java中推荐使

java 8 map遍历方式 (转)

public class LambdaMap { private Map<String, Object> map = new HashMap<>(); @Before public void initData() { map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3&q

Java Map遍历方式的选择

1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率.那么实际情况如何呢? 为了解遍历性能的真实差距,包括在遍历key+value.遍历key.遍历value等不同场景下的差异,我试着进行了一些对比测试. 2. 对比测试 一开始只进行了简单的测试,但结果却表明k

老李分享:《Java Performance》笔记1——性能分析基础 1

老李分享:<Java Performance>笔记1——性能分析基础 1.性能分析两种方法: (1).自顶向下: 应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会. (2).自底向上: 性能专家从软件栈底层的CPU统计数据(例如CPU高速缓存未命中率.CPU指令效率)开始,逐渐上升到应用自身的结构或应用常见的使用方式. 2.CPU使用率: 大多数操作系统的CPU使用率分为用户态CPU使用率和系统态CPU使用率. 用户态CPU使用率:执行应用程序代码的时间占总CPU时间的百分比

【转】Java Map遍历方式的选择

1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率.那么实际情况如何呢? 为了解遍历性能的真实差距,包括在遍历key+value.遍历key.遍历value等不同场景下的差异,我试着进行了一些对比测试. 2. 对比测试 一开始只进行了简单的测试,但结果却表明k

java 中map遍历的四种方法和优缺点

/** * 在for-each循环中使用entries来遍历 * 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用 * 如果遍历的是一个空的map,会报数组越界 ,java5引入,不兼容老版本 * @param map */ public void methodOne(Map<Integer, Integer> map){ for (Map.Entry<Integer, Integer> entry : map.entrySet()) { System.out

Java集合的遍历方式

Map的遍历 1.通过map.entrySet遍历Key和Value Map<Integer,Integer> map = new HashMap<>(); map.put(1, 10); map.put(2, 8); for(Map.Entry<Integer, Integer> entry : map.entrySet()) { System.out.println(entry.getKey() + " ---- " + entry.getVal

ArrayList的不同的遍历方式性能比较,其实都差不了多少

//RadomAcess的接口for..i的遍历比for..loop的快,@more see comments for interface RandomAcess   import java.util.ArrayList; import java.util.Iterator; import java.util.List;   public class ListPerformanceTest {     public static void main(String[] args) {      

《Java Performance》笔记1——性能分析基础 2

4.内存使用率: 内存使用率的相关属性包括页面调度或页面交换.加锁.线程迁移中的让步式和抢占式上下文切换. 当应用运行所需的内存超过可用物理内存时,就会发生内存页面交换,系统在进行页面交换或使用虚拟内存时,应用会表现出明显的性能问题.为了应对这种可能出现的情况,通常要为系统配置swap空间,swap空间一般会在一个独立的磁盘分区上,当应用耗尽物理内存时,操作系统会将应用中最少运行的部分置换到磁盘上的swap空间,当访问应用被置换出去的数据时,就必须将它从磁盘置换进物理内存,而这种置换活动会对性能