2015-10-13 109 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());