- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我第一次参与一个相当大的项目,我被要求获得最好的表演。
所以我想用 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/
有人可以告诉我,如果 (ListIterator it = listIterator(); it.hasNext(); )部分代码应写为 for (ListIterator it = list.lis
我在替换数组列表中的项目时遇到问题。我搜索了 soultion,发现它是由 listIterator 完成的。所以我想实现它,但不知何故迭代器的“set”方法不可用。为什么?整个事情都发生在我的 sp
我有两个 ArrayList,每个都包含一定大小的块:blockList、eraseList。块是具有两个字段的对象:开始和结束。我需要从另一组块中减去一组块。 我必须遍历删除器列表并从它们重叠的块列
我有一个自定义的、通用的、单独的 LinkedList,它是我自己构建的。我可以在列表中添加、删除等。我想在我的类中实现 Java ListIterator。我将如何开始这个?我需要将哪些方法添加到我
我正在努力实现一种检查 ArrayList 中连续相等元素的最大数量的方法: public class ArrayReader { public int getMaxConsecutiveEq
我有一个简单的 Java LinkedList,它有 10 个元素。在这种状态下,我得到一个普通的 ListIterator,比如 .listIterator(3)。如果我随后将其他元素插入/删除到列
我正在读一篇thread这里介绍一下java ArrayList和LinkedList的性能。有来自Mr Kevin Brock的答复内容如下。 "Linked list add is not alw
我有一个引用类型的数组。我想使用 hasPrevious() 和 hasNext() 方法。我想使用ListIterator。将数组转换为 ListIterator 的正确方法吗? 最佳答案 我发现执
我有一个简短的问题,关于 ListIterators(我想,通常是 Iterators)在 Java 中的表现。例如,对于一个链表(Java 的标准链表),如果我为其获取一个 ListIterator
我需要在ListIterator“nodeListIterator”中交换node和node.getNext(),并且我已经尝试了几个小时 if (node instanceof LdcInsnNo
所以我的问题是,是否可以通过使用带有列表名称(foodList、foodAmount 等)的数组来简化这段代码,而不是用列表名称(来自所述数组)进行某种循环来替换迭代器中的占位符? 这是代码: pub
package wrap; import java.util.*; public class ArrayListDemo { public static void main(String []
我目前正在尝试学习如何实现我自己的 ListIterators。除了我对 previous() 方法感到困惑外,我已经实现了其中的大部分并准备就绪。按照标准惯例,我可以解释一下 previous()
我有如下所示的代码片段: ArrayList a = new ArrayList(); ListIterator p = a.listIterator(); 但是,我注意到您实际上不需要为 Li
代码: Random Picker = new Random(); List list = new ArrayList(); list.add("card1"); list.add("ca
关于Java中迭代的问题。我(在某种程度上)熟悉 Iterator、ListIterator 和 Iterable 接口(interface),即我了解它们背后的想法。但这也是我的问题所在。 如果
我有两个类:ParentClass 和 SubClass。子类继承自父类。我有以下代码:(在类内) List lstSub; //some initialization public ListIter
我编写了以下使用列表迭代器函数的代码,为什么没有打印出结果,谁能告诉我出了什么问题?谢谢。 import java.util.ArrayList; import java.util.ListItera
如何从 ListIterator 中删除所有元素,然后添加新元素。我在最后一行添加到迭代器时遇到 ConcurrentModificationException 。 public static voi
我正在使用 Java 进行编程,我创建了一个类来获取一个迭代器,因为我在此代码中仅使用一个列表 public ListIterator iterateur() { ListIterator i
我是一名优秀的程序员,十分优秀!