我意識到這個問題已經被回答了。但我認爲缺少一個重要的答案:初始化值爲0..4093的LinkedList的最快方法是...... 請勿全部在處執行此操作。特別是如果速度是一個問題。
你基本上正在做的是創建一個由4093 Node
元素組成的結構,每個元素包含兩個指向prev/next元素的指針和一個指向Integer對象的指針。每個Node
都必須創建(並免費)。另外幾乎每個包含Integer的都必須創建(並釋放)。 '接近',因爲Java使用Integer緩存,但通常情況下(可以通過系統屬性更改)在-127..127的範圍內。
爲了得到一個簡單的整數列表,這要做很多事情,並且如果使用密集型方法給GC之後要做很多事情。
這就是說有很多可能的方式以更有效的方式做到這一點。但它們取決於具體的使用模式。僅舉幾例:
- 使用數組:如果它採取
boolean [] inUse' and set the taken vlan-id to
TRUE`
- 更妙的是使用位集合,而不是陣列
- 不要存放哪個VLAN是免費的,但其VLAN是拍攝。我認爲他們傾向於自由,所以有更多的自由,因爲有人採取。 (這意味着要跟蹤更少)。
- 如果您堅持使用LinkedList,請不要使用您的類對它進行初始化,而是讓它已經初始化。這取決於你需要多少人。你可以保持一池。或者你的代碼允許重新使用舊列表。 (是的,你可以在使用後對它們進行排序。)
當然還有更多...
所有這些方法都需要你建立自己的「隊列」界面。但也許這並不像Java那樣豐富。而且它確實不那麼困難。如果你真的使用這個密集型,你可以達到性能改善因子10x-1000x ++。
使用BitSet
有近沒有實例化成本的一種可能的實現可能是:
import java.util.BitSet;
import org.testng.annotations.Test;
public class BitSetQueue {
// Represents the values 0..size-1
private final BitSet bitset;
private final int size;
private int current = 0;
private int taken = 0;
public BitSetQueue(int size){
this.bitset = new BitSet(size);
this.size = size;
this.current = size-1;
}
public int poll(){
// prevent endless loop
if(taken == size) return -1;
// seek for next free value.
// can be changed according to policy
while(true){
current = (current+1)%size;
if(! bitset.get(current)){
bitset.set(current);
taken++;
return current;
}
}
}
public boolean free(int num){
if(bitset.get(num)){
bitset.clear(num);
taken--;
return true;
}
return false;
}
@Test
public static void usage(){
BitSetQueue q = new BitSetQueue(4094);
for(int i = 0; i < 4094; i++){
assertEquals(q.poll(), i);
}
assertEquals(q.poll(), -1); // No more available
assertTrue(q.free(20));
assertTrue(q.free(51));
assertEquals(q.poll(), 20);
assertEquals(q.poll(), 51);
}
}
我不認爲有任何其他方式 –
你可以嘗試創建一個即時陣列和使用asList,但我d在您需要的實際環境下進行配置。我會編程生成數組代碼,除非你真的喜歡打字。 –
4094?別擔心,你會沒事的...... –