gpt4 book ai didi

java - 优化:用ListIterator替换for循环

转载 作者:行者123 更新时间:2023-12-02 07:25:10 24 4
gpt4 key购买 nike

这是我第一次参与一个相当大的项目,我被要求获得最好的表演。

所以我想用 ListIterator 替换我的 for 循环,因为我有大约 180 个循环在列表上调用 list.get(i)大约 5000 个元素。

所以我有两个问题。

1) 这两个片段相等吗?我的意思是,它们产生相同的输出吗?如果不是,我该如何纠正 ListIterator 问题?

ListIterator<Corsa> ridesIterator = rides.listIterator();
while (ridesIterator.hasNext()) {
ridesIterator.next();
Corsa previous = ridesIterator.previous(); //rides.get(i-1)
Corsa current = ridesIterator.next(); //rides.get(i)
if (current.getOP() < d.getFFP() && previous.getOA() > d.getIP() && current.wait(previous) > DP) {
doSomething();
break;
}
}

__

for (int i = 1; i < rides.size(); i++) {
if (rides.get(i).getOP() < d.getFP() && rides.get(i - 1).getOA() > d.getIP() && rides.get(i).getOP() - rides.get(i - 1).getOA() > DP) {
doSomething();
break;
}
}

2)如果我有这样的东西,它会是第一个片段吗? (更改了 i 及其退出条件)

for (int i = 0; i < rides.size() - 1; i++) {
if (rides.get(i).getOP() < d.getFP() && rides.get(i + 1).getOA() > d.getIP() && rides.get(i).getOP() - rides.get(i + 1).getOA() > DP) {
doSomething();
break;
}
}

我这么问是因为这是我第一次使用 ListIterator,而且我现在无法尝试!

编辑:我没有使用 ArrayList,它是基于 LinkedList 的自定义列表

编辑2:我正在添加更多信息。我无法使用缓存系统,因为我的数据在每次迭代时都会发生变化,并且管理缓存会很困难,因为我必须处理不一致的数据。我什至无法将其中一些循环合并到一个大循环中,因为我使用不同的方法将它们合并起来,因为它们需要做很多不同的事情。

那么,针对这个特殊情况,您认为最好的做法是什么?ListIterator 是处理我的情况的最佳方法吗?如果我的 for 循环在 0 和 size-1 之间工作,我该如何使用 ListIterator ?

最佳答案

如果您知道最大大小,那么当您退出诸如 ArrayList 之类的集合时,您将获得最佳性能。用简单的数组替换它们。

因此,请创建 ArrayList<Corsa>有 5000 个元素,执行 Corsa[] rides = new Corsa[5000] 。而不是硬编码5000将其用作 final static int MAX_RIDES = 5000例如,避免 magic number在代码中。然后用正常的for进行迭代,引用rides[i]

通常,如果您追求性能,则应该使用 Java 进行编码,就像使用 C/C++ 一样(当然可以)。代码不是那么面向对象和漂亮,但是速度很快。请记住,当您确定找到瓶颈时,请务必在最后进行优化。否则,你的努力都是徒劳的,只会降低代码的可读性和可维护性。还可以使用 profiler ,以确保您的更改实际上是升级,而不是降级。

使用 ListIterator 的另一个缺点是它内部分配内存。因此GC(垃圾收集器)会更频繁地唤醒,这也会对整体性能产生影响。

关于java - 优化:用ListIterator替换for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13663011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com