2015-10-13 108 views
-3

我有一个循环,其中n非常大。我有一个arraylist alist,在每次后续循环运行后,逐一添加元素。有没有优化这个循环的方法,以便代码运行更快或者其他方法可以并行添加元素。 在此先感谢。优化for循环用于在arraylist中添加元素

   for(int i=0;i<=n;i++) 
       { 
       /* 
        some code 
        */ 
        alist.add(element); 
       } 
+1

鉴于你的问题陈述和“一些代码”的使用,我会说答案是“多长时间是一段字符串”。 –

回答

2

当你实例化数组列表,请确保您使用单参数的构造函数:

ArrayList</*your type*/>(n + 1)

这将ArrayList能力设置为所需的许多元素。这样做可以防止内存重新分配,这将有助于运行时的性能。它不会限制ArrayList容量,但建议它可以得到那么大的对象。

至于进一步的优化,这将取决于/*some code*/是否是瓶颈;这可能是。

2

其实这样做并行(多线程)可能会是因为他们全是在争夺,因为你必须连续访问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

+0

我承认我偷了你的'n + 1'。请接受我的歉意,采取积极的态度。 – Bathsheba

+0

@Bathsheba:LOL :-)还有你的回答+1(这里有很多+1)。 –

1

如果您使用的是ArrayList那么推测顺序很重要。在这种情况下,你真的不能使用传统技术在不同的线程中添加元素。他们仍然需要按照正确的顺序进行连续处理。

根据您的应用程序,可能会使用Java 8线程。如果每个元素可以并行处理,那么可以独立执行每个步骤,然后将结果收集到列表中。例如:

List<Element> result = IntStream.range(0, n).parallel() 
    .mapToObj(n -> codeCreatingElement(n)).collect(Collectors.toList());