2013-02-15 74 views
1

我有一個程序包含鏈接列表數據結構來存儲自定義TCP數據包。爪哇 - 鏈接列表存儲難度

測試程序讀取數據包,將其添加到鏈接列表隊列中,並立即打印數據包值(時間戳值)以進行確認。此過程在while循環中重複10次,因此鏈接列表隊列中有10個數據包。

在所有數據包讀入後,問題都伴隨着對隊列值的檢查。問題是僅顯示最後一個數據包的讀入值,儘管知道存在另外9個具有不同值的數據包(據說)在隊列中。

如果有人能幫助我理解這個看似黑魔法,我會非常感激。

public void readPackets() throws IOException { 
    int counter = 1; 

    while(counter < 10){ 
     packet = con.fillWIMPacket(packet); 
     packetQueue.add(packet); 
     System.out.println("Packet " + counter + " added to Queue"); 
     System.out.println("Packet " + counter + " " + packet.toString()); 
     counter++; 
    } 
} 



public void printPacketValues(){ 

    System.out.println("Packet Queue size is " + packetQueue.size()); 


    for(int i = 0; i < packetQueue.size(); i++){ 
     System.out.println("Packet " + i + ": " + packetQueue.get(i)); 
    } 

} 

我應該澄清第一個readPackets()的println()方法以正確的順序顯示數據。然而,printPacketValues的的println()()只顯示最後一個數據包的價值10倍..

+0

您可以發佈任何痕跡和/或調用的方法?是否拋出了任何'IOException'? – orique 2013-02-15 11:53:47

+1

將'fillWIMPacket'的實現添加到您的代碼中。看起來您可能正在返回與參數傳遞相同的實例,在這種情況下,您的隊列中包含10個相同的對象。 – Perception 2013-02-15 12:02:42

+0

爲什麼你不使用for循環而不使用while循環? – 2013-02-15 12:25:40

回答

1
while(counter < 10){ 
    packet = new PacketType(); //change here and try once. 
    packet = con.fillWIMPacket(packet); 
    packetQueue.add(packet); 
    System.out.println("Packet " + counter + " added to Queue"); 
    System.out.println("Packet " + counter + " " + packet.toString()); 
    counter++; 
} 
+1

完美。爲什麼應該創造一個新的實例被老化。不應該覆蓋舊的參考? – Jnanathan 2013-02-15 12:28:39

+0

@Jnanathan NO。您的鏈接列表將包含一個對同一實例的引用列表,並修改一個實例會影響該鏈接列表中的每個條目(如果您不創建新實例)。 – 2013-02-15 12:52:59