java - 在 Java 中收集符号出现的最快方法是什么

标签 java arrays performance arraylist hashmap

我的目标是制作一个函数来计算某些符号(字符)在一行中的出现次数。 一个 int ID 给了我需要计算的每个字符。 字符集是有限的,我从一开始就知道。 所有行仅由给定集中的字符组成。 该函数处理大量的行。 我的探查器总是显示收集统计数据的函数是最慢的 (97%),尽管该程序做了很多其他事情。 首先,我使用了一个 HashMap 和如下代码:

    occurances = new HashMap<>();
    for (int symbol : line) {
        Integer amount = 1;
        if (occurances.containsKey(symbol)) {
            amount += occurances.get(symbol);
        }
        occurances.put(symbol, amount);
    }

分析器显示 hashMap.put 占用了 97% 的处理器使用率

然后我尝试用创建一次的 ArrayList 替换它: 并对其进行了一些优化(行总是长于 1 个字符),但它仍然很慢。

    int symbol = line[0];
    occurances.set(symbol, 1);

    for (int i = 1; i < length; i++) {
        symbol = line[i];
        occurances.set(symbol, 1 + occurances.get(symbol));
    }

如果有人有更好的想法如何以更好的性能解决此任务,我们将不胜感激。

最佳答案

按照建议here你可以尝试做类似的事情

List<Integer> line = //get line as a list;
Map<Integer, Long> intCount = line.parallelStream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

关于java - 在 Java 中收集符号出现的最快方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38813735/

相关文章:

reactjs - React Native 应用程序中的 Redux 非常慢,有大量数据

java - Java 中处理大型对象列表的线程

java - 无法为 tomcat jvm 公开 Java Instrumentation

arrays - 奇怪的 ArrayBuffer 行为

java - 再次重新执行for循环

oracle - "after servererror on database trigger"是个好主意吗?

java - 如何将特定的 logback.xml 传递给记录器?

java - 使用 MapStruct 将 2 个字符串字段映射到 OffsetDateTime

c++ - 从单独的文本文件中获取数组值

从 .NET 2.0 升级到 .NET 3.5 时 JavaScript 速度很慢