java - 如何使用 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());
}
欢迎任何帮助,谢谢大家
解决方案
看来选择的ArrayList
不太好。
在第一种情况下,您尝试通过列表中的属性查找对象。要在列表中查找对象,您必须签入列表中的每个元素。列表越大,它就会越长。(ArrayList 的最坏情况复杂度为 O(N))
如果您使用 aHashMap
而不是 a List
,则可以将您的属性用作地图的键。像这样,您可以直接选择需要更新的对象,而无需检查列表中的每个元素。执行时间将不再取决于条目数。(HashMap 的最坏情况复杂度为 O(1))
如果您使用HashMap
而不是ArrayList
,您的更新代码将如下所示:
public void update(MyClass myClass) {
map.put(myClass.getKey(), myClass);
}
(getKey()
您尝试在 foo 方法中使用的属性在哪里)。
但这仅适用于第一种情况。根据我们掌握的信息,这似乎是最好的解决方案。
推荐阅读
- wordpress - Wordpress 搜索小部件
- linux - 影响启动它的交互式 shell 的脚本
- include - 格子钻石`包括不工作
- dart - 如何在 Flutter 的 SliverAppBar 中添加 Tabbar?
- javascript - FormData 对象仅获取文件输入,而不是其他输入,例如文本
- tensorflow - 使用 Estimator API 生成文本
- php - SQL:如何插入自定义增量值
- dart - 链接到 Dart 注释中的类以获取文档
- asp.net-core - WebRootPath 和 TestServer
- java - 动态创建的edittext的值没有被存储