热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

性能:遍历ArrayList数百次,而不是将Arraylist转换为HashMap并返回?

如何解决《性能:遍历ArrayList数百次,而不是将Arraylist转换为HashMap并返回?》经验,为你挑选了1个好方法。

我有两个需要比较和操作的大型(1000多个对象)ArrayList。我本质上需要从ArrayList A中获取一个值,在ArrayList B中查找匹配的对象,然后从B中操作该对象。我需要在A的所有对象中执行此操作。我需要在应用程序中经常执行此操作。订单未知,大小会有所不同。

(pseudocode)
ArrayList A
ArrayList B

对于A中的每个实体,我都可以遍历B中的每个单个项目,寻找与A中的实体匹配的项目。这似乎效率很低。

(pseudocode)
for (each object in A){loop through all of B and find it}

值得将B转换为HashMap(使用我正在比较的特定值作为键,将对象作为值),然后以这种方式搜索B,然后在完成处理后将该临时HashMap转换回ArrayList。 ?

(pseudocode)
convert B to HashMap C
for (each object in A){look up the value in C}
convert C back to an ArrayList

这是一个好主意吗?还是这种过早/不必要的优化?谢谢。

(背景:数据从服务中以ArrayList的形式从我那里得到-前端需要一个ArrayList用于视图层。我试图使中间层的处理效率更高-但是入口和出口对象必须是ArrayList(或某些对象)其他清单))



1> rgettman..:

是的,对于大量而言,a HashMap是有益的。

您的初始算法将花费很长时间,在嵌套的for循环中遍历两个列表。这是一个O(n 2)算法。即使假设A和中各有1000个项目B,并假设比较两个单独项目(一个来自A一个,另一个来自)的成本为1 B,您仍要进行500k比较(避免将每个项目进行两次比较)。经常这样做会导致性能降低。

假设您的对象具有良好的哈希码算法,则从a中查找值HashMap是O(1)访问。您仍然会花费O(n)的时间来构造它,但是与O(n 2)相比,如果您有大量的项目,那没什么。

HashMap只要B的信息未更改,就使用“ B”中的数据构造一次“ C”并多次使用。如果您“需要经常执行此操作”,则性能会更好,因为HashMap已经构建了,只需重用即可。

如果需要维护顺序,请将B列表索引存储为哈希图中的值。

您不需要“将临时哈希图转换回arraylist”,因为创建HashMap“ C”并不会破坏原始列表“ B”。要注意的一件事是,列表中的对象是否B发生更改,从而迫使对的更新HashMap保持一致。要注意的另一件事是您对非常大的列表的内存使用情况–您可以将对象,列表和哈希图保留在内存中吗?

您的伪代码:

for each index in B:
    get object b
    put in hash map C values (b, index)

for each a in A:
    if found in hash map C: do something with found object

对于较小的数字,O(n 2)性能时间将足够短,以至于HashMap不值得这样做。这是您需要做出的决定-您需要确定列表何时足够大,以至于建造HashMap和使用它值得HashMap建造成本。


推荐阅读
  • 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每 ... [详细]
  • 转载自:http:www.blogjava.netCarpenterLeearchive20160427430268.html总体介绍之所以把HashSet和HashMa ... [详细]
  • Java面试 HashMap、HashSet源码解析
    本章所有源代码基于JDK1.8版本HashMap和HashSet是JavaCollectionFramework的两个重要成员,其中HashMap是Map接口的常用实现类,Hash ... [详细]
  • 写这篇文章起源于一道面试题,如何将自定义的类对象作为key存储到HashMap中,即考虑怎么判断key的唯一性。首先,我们看以下HashMap中put(…)方法的源码:public ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • Java学习第10天:深入理解Map接口及其应用 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 本篇文章给大家分享的是有关Java中怎么对HashMap按键值排序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话 ... [详细]
  • ***功能:排序*privatestaticvoidoutputRegionStatistics(HashMap<String,Integer>regionMap){ ... [详细]
  • 将学生对象和学生的归属地通过键与值存储到map集合中。importjava.util.HashMap;importjava.util.Iterator;importjava.uti ... [详细]
  • 01Map集合概述A:Map集合概述:我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同a:Collection中的集合 ... [详细]
  • 手写HashMap,快手面试官直呼内行
    手写HashMap,快手面试官直呼内行-手写HashMap?这么狠,面试都卷到这种程度了?第一次见到这个面试题,是在某个不方便透露姓名的Offer收割机大佬的文章:这……我当 ... [详细]
  • 在Java中有多种遍历HashMap的方法,注意Java中所有的Map类型都实现了共有的Map接口,所以接下来方法适用于所有Map(如:HaspMap,TreeMap,Linked ... [详细]
author-avatar
卢-lydia09
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有