You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中高效比较列表元素并查找唯一元素位置的方法

高效查找Java列表中首个唯一元素的位置

你的原代码问题在于每次调用Collections.frequency(strings, strings.get(i))都会完整遍历整个列表,时间复杂度是O(n²)——当列表元素数量很大时,这种嵌套遍历的耗时会呈指数级增长,完全不适合处理大数据量。

下面是时间复杂度为**O(n)**的高效实现方案,用HashMap统计元素出现频率,分两次遍历完成:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class UniqueIndexFinder {
    public static void main(String[] args) {
        ArrayList<String> strings = new ArrayList<>();
        strings.add("Hi");
        strings.add("Hi");
        strings.add("No");
        
        // 第一步:遍历一次列表,统计每个元素的出现次数
        Map<String, Integer> countMap = new HashMap<>();
        for (String s : strings) {
            // 用getOrDefault简化计数逻辑,不存在则默认0,加1后存入
            countMap.put(s, countMap.getOrDefault(s, 0) + 1);
        }
        
        // 第二步:再次遍历列表,找到第一个出现次数为1的元素的索引
        for (int i = 0; i < strings.size(); i++) {
            if (countMap.get(strings.get(i)) == 1) {
                System.out.println(i); // 输出2
                break; // 找到首个目标就终止循环
            }
        }
    }
}

为什么这个方法更高效?

  • 第一次遍历仅需O(n)时间完成频率统计,第二次遍历同样O(n)时间查找目标,总时间复杂度为O(n),远优于原方案的O(n²)。
  • 空间复杂度为O(k),k是列表中不同元素的数量,在大多数场景下都是可接受的。

如果你的Java版本是8及以上,也可以用Stream API简化统计步骤,但性能和上面的方案基本一致:

import java.util.stream.Collectors;
import java.util.function.Function;

// ...
Map<String, Long> countMap = strings.stream()
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

内容的提问来源于stack exchange,提问作者ZedORYasuo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:18:27