首页 > 解决方案 > 如何使用 Java ArrayList 提高性能

问题描述

我正在使用带有以下代码的巨大 ArrayList

public final List<MyClass> list = new ArrayList<>();

public void update(MyClass myClass) {
int i;
for (i=0; i < list.size(); i++) {
        if (myClass.foo(list.get(i))) {
            list.set(i, myClass);
            break;
        }    
    }    
    if (i == list.size()) {    
        list.add(myClass);    
    }    
}

该列表非常大。在这种情况下,我还可以做些什么来提高性能?也许使用一些 Java 8 功能,替换 ArrayList 或类似的东西。

与此列表相关的另一个运行时间过长的代码是以下代码:

public List<MyClass> something(Integer amount) {
list.sort((m1, m2) -> Double.compare(m2.getBar(), m1.getBar()));
return list.stream()
        .limit(amount)
        .collect(Collectors.toList());
}

欢迎任何帮助,谢谢大家

标签: javaperformancearraylistcollections

解决方案


看来选择的ArrayList不太好。

在第一种情况下,您尝试通过列表中的属性查找对象。要在列表中查找对象,您必须签入列表中的每个元素。列表越大,它就会越长。(ArrayList 的最坏情况复杂度为 O(N))

如果您使用 aHashMap而不是 a List,则可以将您的属性用作地图的键。像这样,您可以直接选择需要更新的对象,而无需检查列表中的每个元素。执行时间将不再取决于条目数。(HashMap 的最坏情况复杂度为 O(1))

如果您使用HashMap而不是ArrayList,您的更新代码将如下所示:

public void update(MyClass myClass) {
    map.put(myClass.getKey(), myClass);
}

getKey()您尝试在 foo 方法中使用的属性在哪里)。

但这仅适用于第一种情况。根据我们掌握的信息,这似乎是最好的解决方案。


推荐阅读