LinkedList addLast函数替换列表中的其他值



我目前正在实现一个用于发送数据包的队列。然而,我遇到了一个问题,当我在LinkedList上使用addLast函数时,它会用我添加到列表中的Pair替换列表中的每个Pair。

队列:

private LinkedList<Pair<Integer, ByteBuffer>> queue;

Pair已从javafx.util.Pair导入;

队列初始化:

queue = new LinkedList<>();

方法:

public synchronized void addToQueue(int bytes, ByteBuffer data) {
Pair<Integer, ByteBuffer> local = new Pair(bytes, data);
queue.addLast(new Pair(bytes, data));
if(bytes>2){
int i = 0;
for(Pair<Integer,ByteBuffer> datas:queue ){
System.out.println("n Data in the "+i+ "th position in queue is: ");
printByteBufferAsBytes(datas.getValue(), datas.getKey());
i++;
}
}
}

为了调试,每当发送数据包时,我都会打印data。这种方法也可以用来发送较小的数据包,但它似乎可以正确地处理较小的数据。

运行代码后,将打印以下结果:

Data in the 0th position in queue is: 
1 5 40 -128 -58 0 0 42 111 34 -24 0 0 0 0 112 114 105 110 116 66 121 116 101 66 117 102 102 101 114 65 115 something was added to queue
Data in the 0th position in queue is: 
2 5 40 -128 -58 17 0 115 -86 119 76 66 121 116 101 115 40 113 117 101 117 101 46 112 101 101 107 40 41 46 103 101 
Data in the 1th position in queue is: 
2 5 40 -128 -58 17 0 115 -86 119 76 66 121 116 101 115 40 113 117 101 117 101 46 112 101 101 107 40 41 46 103 101 something was added to queue
Data in the 0th position in queue is: 
2 5 40 -128 -58 38 0 -102 -46 -61 99 116 86 97 108 117 101 40 41 44 32 113 117 101 117 101 46 112 101 101 107 40 
Data in the 1th position in queue is: 
2 5 40 -128 -58 38 0 -102 -46 -61 99 116 86 97 108 117 101 40 41 44 32 113 117 101 117 101 46 112 101 101 107 40 
Data in the 2th position in queue is: 
2 5 40 -128 -58 38 0 -102 -46 -61 99 116 86 97 108 117 101 40 41 44 32 113 117 101 117 101 46 112 101 101 107 40 something was added to queue
Data in the 0th position in queue is: 
3 5 40 -128 -58 59 0 109 60 120 12 11 41 46 103 101 116 75 101 121 40 41 41 101 117 101 46 112 101 101 107 40 
Data in the 1th position in queue is: 
3 5 40 -128 -58 59 0 109 60 120 12 11 41 46 103 101 116 75 101 121 40 41 41 101 117 101 46 112 101 101 107 40 
Data in the 2th position in queue is: 
3 5 40 -128 -58 59 0 109 60 120 12 11 41 46 103 101 116 75 101 121 40 41 41 101 117 101 46 112 101 101 107 40 
Data in the 3th position in queue is: 
3 5 40 -128 -58 59 0 109 60 120 12 11 41 46 103 101 116 75 101 121 40 41 41 101 117 101 46 112 101 101 107 40

似乎每次向队列中添加内容时,队列中的所有其他值都设置为相同的值。如果有人知道这其中的原因,我将非常感谢任何指点。

方法printByteBufferAsBytes:

public void printByteBufferAsBytes(ByteBuffer bytes, int bytesLength) {
for (int i = 0; i < bytesLength; i++) {
System.out.print(Byte.toString(bytes.get(i)) + " ");
}
}

在方法addToQueue中,您需要将更新的ByteBuffer的内容复制到某个新的字节数组:

public synchronized void addToQueue(int bytes, ByteBuffer data) {
byte[] copy = Arrays.copyOf(data.array(), bytes);
Pair<Integer, ByteBuffer> local = new Pair<>(bytes, ByteBuffer.wrap(copy));
queue.addLast(local);
// ... the rest of the method remains as is
}

在LinkedList(Java(上实现addLast((如下:

public void addLast(AnyType item)
{
if( head == null)
addFirst(item);
else
{
Node<AnyType> tmp = head;
while(tmp.next != null) tmp = tmp.next;
tmp.next = new Node<AnyType>(item, null);
}
}

Java中有一个Queue的实现,我建议使用它而不是LinkedList。此外,出列和入列方法应用于遵循术语。

Queue(在Java中(上的入队((和出队((方法定义如下:

public void enqueue(Item item) {
Node oldlast = last;
last = new Node();
last.item = item;
last.next = null;
if (isEmpty()) first = last;
else           oldlast.next = last;
n++;
assert check();
}
public Item dequeue() {
if (isEmpty()) throw new NoSuchElementException("Queue underflow");
Item item = first.item;
first = first.next;
n--;
if (isEmpty()) last = null;   // to avoid loitering
assert check();
return item;
}

LinkedLists上的一个小注释是,方法add((等效于addLast((。

最新更新