我有一個循環,其中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());
鑑於你的問題陳述和「一些代碼」的使用,我會說答案是「多長時間是一段字符串」。 –