Java for循环Map集合优化实现解析

这篇文章主要介绍了Java for循环Map集合优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在《for循环实战性能优化》中提出了五种提升for循环性能的优化策略,这次我们在其中嵌套循环优化小循环驱动大循环的基础上,借助Map集合高效的查询性能来优化嵌套for循环。

如果小循环和大循环的集合元素数量分别为M和N,则双层For循环的循环次数是M*N,随着M和N的增长,对性能的影响越来越大。因此,本文考虑进一步优化,使得循环次数变为M+N。利用下面的代码来模拟测试两种情况的性能:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class ForUpdate {

  public static void main(String[] args) {

//    for (int i = 0; i < 10000; i += 10) {
//      loopGivenNum(i);
//    }
    for (int i = 10000; i < 100000; i += 10000) {
      loopGivenNum(i);
    }
    System.out.println("----- done -----");

  }

  private static void loopGivenNum(int i) {
    List<String> smallLoop = getLoopList(i);
    List<String> bigLoop = getLoopList(2 * i);
    long doByForTimes = doByFor(bigLoop, smallLoop);
    long doByMapTimes = doByMap(bigLoop, smallLoop);
    System.out.println("size " + i + ": " + doByForTimes + "," + doByMapTimes);
  }

  /**
   * 获取循环变量
   * @param size 循环变量元素个数
   */
  private static List<String> getLoopList(int size) {
    List<String> list = new ArrayList<>();
    for (int i = 0; i < size; i++) {
      list.add(String.valueOf(i));
    }
    return list;
  }

  private static long doByFor(List<String> bigLoop, List<String> smallLoop) {
    long startTime = System.currentTimeMillis();
    for (String str1 : smallLoop) {
      for (String str2 : bigLoop) {
        if (str1.equals(str2)) {
          continue;
        }
      }
    }
    return System.currentTimeMillis() - startTime;
  }

  /**
   * 使用 Map 优化
   * @param bigLoop
   * @param smallLoop
   */
  private static long doByMap(List<String> bigLoop, List<String> smallLoop) {
    long startTime = System.currentTimeMillis();
    // 转换成map
    Map<String, String> loopMap = bigLoop.stream().collect(Collectors.toMap(k -> k, Function.identity()));
    System.out.println(loopMap.size());
    for (String str1 : smallLoop) {
      if (loopMap.containsKey(str1)) {
        continue;
      }
    }
    return System.currentTimeMillis() - startTime;
  }
}

输出结果:

size 10000: 756,97
size 20000: 3091,8
size 30000: 4342,7
size 40000: 8848,7
size 50000: 16317,7
size 60000: 31652,7
size 70000: 37078,7

由此可见,数据量越大嵌套For循环执行时间越长,而使用Map后,纵使数据量增长到了20w,执行时间也维持在7ms左右。数据量小的时候,执行结果就不再贴出来了。

结论:使用Map优化后的方法执行的效率比嵌套循环提高了很多很多。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java 遍历取出Map集合key-value数据的4种方法

    将map集合存数据与取出数据全部放在一个类MapTest中,方便阅读与查看 随便创建一个包,在包中新建一个class文件,(也可以不建包,直接新建一个class文件) 新建class文件MapTest.java,代码如下: import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class

  • Java集合Set、List、Map的遍历方法

    本文实例讲述了Java集合Set.List.Map的遍历方法,分享给大家供大家参考. 具体方法如下: package com.shellway.javase; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.uti

  • Java实现过滤掉map集合中key或value为空的值示例

    本文实例讲述了Java实现过滤掉map集合中key或value为空的值.分享给大家供大家参考,具体如下: import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * 过滤掉map集合中key或value为空的值 * @author lmb * @date 2017-3-14 */ public

  • Java集合基础知识 List/Set/Map详解

    一.List Set 区别 List 有序,可重复: Set 无序,不重复: 二.List Set 实现类间区别及原理 Arraylist 底层实现使用Object[],数组查询效率高 扩容机制 1.6采用(capacity * 3)/ 2 + 1,默认容量为10: 1.7采用(capacity >> 2 + capacity)实现,位移动效率高于数学运算,右移一位等于乘以2倍: 读取速度快,写入会涉及到扩容,所以相对较慢. LinkedList底层采用双向链表,只记录 first 和 las

  • Java实现Map集合遍历的四种常见方式与用法分析

    本文实例讲述了Java实现Map集合遍历的四种常见方式与用法.分享给大家供大家参考,具体如下: ~Map集合是键值对形式存储值的,所以遍历Map集合无非就是获取键和值,根据实际需求,进行获取键和值 1. 无非就是通过map.keySet()获取到值,然后根据键获取到值 for(String s:map.keySet()){ System.out.println("key : "+s+" value : "+map.get(s)); } 2. 通过Map.Entry(

  • Java8中利用stream对map集合进行过滤的方法

    前言 Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找.遍历.过滤以及常见计算等. 最近公司在大张旗鼓的进行代码审核,从中也发现自己写代码的不好习惯.一次无意的点到了公司封装的对map集合过滤的方法,发现了stream.于是研究了一下.并对原有的代码再次结合Optional进行重构下 原有方法说明 主要处理过滤条件Map对象,过滤掉了null和空字符串 等操作 这

  • 一段代码搞懂关于Java中List、Set集合及Map的使用

    Java中List.Set集合及Map的使用代码如下所示: package tingjizifu; import java.util.*; public class TongJi { /* * 使用Scanner从控制台读取一个字符串,统计字符串中每个字符出现的次数,要求使用学习过的知识完成以上要求 * 实现思路根据Set.List.Map集合的特性完成. */ public static void main(String[] args) { // 输入字符串 Scanner input = n

  • Java集合之HashMap用法详解

    本文实例讲述了Java集合之HashMap用法.分享给大家供大家参考,具体如下: HashMap是最常用的Map集合,它的键值对在存储时要根据键的哈希码来确定值放在哪里. HashMap 中作为键的对象必须重写Object的hashCode()方法和equals()方法 import java.util.Map; import java.util.HashMap; public class lzwCode { public static void main(String [] args) { M

  • 利用java读取web项目中json文件为map集合方法示例

    前言 本文主要介绍了关于java读取web项目中json文件为map集合的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实例介绍 假设当前项目web目录(/resource/test.json)下有一json文件如下: [ { "path": "content_111", "title": "文章1", "imgUrl": "../../../libs/img/ppt

  • Java for循环Map集合优化实现解析

    这篇文章主要介绍了Java for循环Map集合优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在<for循环实战性能优化>中提出了五种提升for循环性能的优化策略,这次我们在其中嵌套循环优化小循环驱动大循环的基础上,借助Map集合高效的查询性能来优化嵌套for循环. 如果小循环和大循环的集合元素数量分别为M和N,则双层For循环的循环次数是M*N,随着M和N的增长,对性能的影响越来越大.因此,本文考虑进一步优化,使得循环次数变为

  • Java中的Map集合简单汇总解析

    Map接口简介 Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射.从Map集合中访问元素时,只要指定了Key,就能找到对应的Value, Map中的键必须是唯一的,不能重复,如果存储了相同的键,后存储的值会覆盖原有的值,简而言之就是键相同,值覆盖. Map常用方法 put(K key, V value) 添加数据,如果先前包含该键的映射,则替换旧值 get(Object key) 返回指定键所映射的值 Set<Map.Ent

  • Java中数组与集合的相互转换实现解析

    这篇文章主要介绍了Java中数组与集合的相互转换实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 List转数组:采用集合的toArray()方法 数组转List:采用Arrays的asList()方法 数组转换为集合 注意:在数组转集合的过程中,要注意是否使用了视图的方式直接返回数组中的数据.以Arrays.asList()为例,它把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出 Unsu

  • Java中遍历Map集合的5种方式总结

    方式一 通过Map.keySet使用iterator遍历 @Test public void testHashMap1() { Map<Integer, String> map = new HashMap<>(); map.put(001, "Java"); map.put(002, "数据库"); map.put(003, "Vue"); System.out.println(map); // 通过Map.keySet使

  • Java 深入浅出掌握Map集合之双列集合

    目录 前言 Map集合 Map概述 Map特点 Map集合的功能 Map集合的遍历 Map集合的各个子类 集合框架图 总结 前言 友友们,大家好哇!这一期我为大家带来双列集合(Map)的相关知识点讲解,那么什么是双列集合呢?Map集合就是采用了key-value键值对映射的方式进行存储.通俗的讲,和查字典类似,查字典时,我们通过偏旁或笔画等查询汉字,集合里通过key找到对应的value,用学生类来说,key相当于学号,value对应name. Map集合 Map概述 Map是一种依照键(key)

  • Java 详解Map集合之HashMap和TreeMap

    目录 HashMap 创建HashMap 添加元素 访问元素 删除元素 TreeMap 创建TreeMap 添加元素 访问元素 删除元素 HashMap.TreeMap区别 Map接口储存一组成对的键-值对象,提供key(键)到value(值)的映射,Map中的key不要求有序,不允许重复.value同样不要求有序,但可以重复.最常见的Map实现类是HashMap,他的储存方式是哈希表,优点是查询指定元素效率高. Map接口被HashMap和TreeMap两个类实现. HashMap HashM

  • Java集合类之Map集合的特点及使用详解

    目录 1.Map集合概述和使用 1.1 Map集合概述 1.2 Map集合常用方法 1.3 Map集合的遍历 1.Map集合概述和使用 1.1 Map集合概述 java.util接口 Map<K,V> 类型参数: K - 此映射所维护的键的类型 V - 映射值的类型 public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 此接口取代 Dictionary 类,后者完全是一个抽象类,而不是一个接口. Map 是一

  • Java中的Set集合简单汇总解析

    Set接口简介 Set接口和List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,它是比Collection接口更加严格了.与List接口不同的是,Set接口元素无序,并且都会以某种规则保证存入的元素不出现重复. Set接口主要有两个实现类,分别是HashSet和TreeSet.其中,HashSet根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能.TreeSet则是以二叉树的

  • Java那点儿事之Map集合不为人知的秘密有哪些

    目录 前言 一.Map 二.HashMap的基本概念 三.HashMap集合的基本方法与使用 四.HashMap集合的遍历 五.HashMap集合的综合案例 六.总结 前言 上期我们说到了Collection集合,他是单列的集合,分为List集合和Set集合,今天我将继续分析一个双列集合也就是Map,为什么叫他双列集合呢? 往下看,你就知道了. 一.Map Map集合的特点 - 键值对映射关系 - 一个键对应一个值 - 键不能重复,值可以重复 - 元素存取无序 我们通过他的一个实现类HashMa

随机推荐