2013-02-15 80 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