我有一个循环,其中n非常大。我有一个arraylist alist,在每次后续循环运行后,逐一添加元素。有没有优化这个循环的方法,以便代码运行更快或者其他方法可以并行添加元素。 在此先感谢。优化for循环用于在arraylist中添加元素
for(int i=0;i<=n;i++)
{
/*
some code
*/
alist.add(element);
}
我有一个循环,其中n非常大。我有一个arraylist alist,在每次后续循环运行后,逐一添加元素。有没有优化这个循环的方法,以便代码运行更快或者其他方法可以并行添加元素。 在此先感谢。优化for循环用于在arraylist中添加元素
for(int i=0;i<=n;i++)
{
/*
some code
*/
alist.add(element);
}
当你实例化数组列表,请确保您使用单参数的构造函数:
ArrayList</*your type*/>(n + 1)
这将ArrayList
的能力设置为所需的许多元素。这样做可以防止内存重新分配,这将有助于运行时的性能。它不会限制ArrayList
容量,但建议它可以得到那么大的对象。
至于进一步的优化,这将取决于/*some code*/
是否是瓶颈;这可能是。
其实这样做并行(多线程)可能会是慢因为他们全是在争夺,因为你必须连续访问ArrayList
。
关于你实际上能做到(根据仅有的一些资料中的问题)的唯一的事情是确保ArrayList
在一开始就对所有你要添加的元素有足够的能力,所以它在你走的时候不需要做一堆重新分配。假设你已经有一个alist
,您可以通过调用ensureCapacity
做到这一点:
alist.ensureCapacity(alist.size() + n + 1); // +1 because you're adding n+1 elements
for (int i = 0; i <= n; i++) { // Note this loops n+1 times
alist.add(/*...some element...*/);
}
如果没有已经有alist
,你做它通过提供一个参数的构造器:
alist = new ArrayList(n + 1);
for (int i = 0; i <= n; i++) {
如果你不这样做,ArrayList
可能不得不在循环过程中重新分配数组,这比一开始就要慢。
如果您已经有某种类型的集合,并将该集合中的所有元素添加到alist
,而不是自己完成,则可以使用addAll
。但基本上这只是ensureCapacity
后跟一堆adds
。
我承认我偷了你的'n + 1'。请接受我的歉意,采取积极的态度。 – Bathsheba
@Bathsheba:LOL :-)还有你的回答+1(这里有很多+1)。 –
如果您使用的是ArrayList
那么推测顺序很重要。在这种情况下,你真的不能使用传统技术在不同的线程中添加元素。他们仍然需要按照正确的顺序进行连续处理。
根据您的应用程序,可能会使用Java 8线程。如果每个元素可以并行处理,那么可以独立执行每个步骤,然后将结果收集到列表中。例如:
List<Element> result = IntStream.range(0, n).parallel()
.mapToObj(n -> codeCreatingElement(n)).collect(Collectors.toList());
鉴于你的问题陈述和“一些代码”的使用,我会说答案是“多长时间是一段字符串”。 –