重复的阵列列表条目

时间:2015-03-11 19:22:33

标签: java arrays list

我目前正在组建一个小型客户端/服务器对,我遇到了ArrayLists的问题,我解决了这个问题,但想要了解更多信息。这是代码示例:

public double[] receiveMessage(int messageLength) throws IOException {
    // wait for bytes
    while (this.getInputStream().available() == 0) {
    }

    // read bytes
    List<byte[]> incomingMessage = new ArrayList<byte[]>();

    int byteLength = 8;
    byte[] tempByte = new byte[byteLength];
    while (this.getInputStream().available() != 0) {
        this.getInputStream().read(tempByte, 0, byteLength);
        incomingMessage.add(tempByte);
    } ............

如果我在每次循环迭代时打印tempByte,我会收到我期望的唯一数组。但是,如果我要打印已完成列表的每个元素&#34; incomingMessage&#34;,我会收到相同的数组(最后一个tempByte数组)&#34; messageLength&#34;次。

当我将tempByte声明放在while循环中并在将其添加到列表后添加了tempByte = null时,此错误已得到修复。

虽然我不是编程专家,但我看到原始错误的原因是什么?

3 个答案:

答案 0 :(得分:1)

问题在于:

byte[] tempByte = new byte[byteLength];
while (this.getInputStream().available() != 0) {
    //...
}

tempByte初始化一次并多次填充。最后,您将tempByte中存储的相同的对象引用更改并存储到incomingMessage中,因此您可以在List中多次看到相同的数组tempByte

有两种可能的解决方案:

  1. 在尽可能窄的范围内初始化变量。在这种情况下,while范围应位于while (this.getInputStream().available() != 0) { //declare the variable here byte[] tempByte = new byte[byteLength]; //... } 循环内:

    while
  2. byte[] tempByte = new byte[byteLength]; while (this.getInputStream().available() != 0) { //... //reinitialize the variable tempByte = new byte[byteLength]; } 循环的每次迭代中重新初始化数组:

    {{1}}
  3. IMO你应该选择1比2来提高代码的可读性。

答案 1 :(得分:1)

您每次都在修改相同的byte[]对象。您在while循环的每次迭代中替换了数组的元素,然后调用了read

在数组中声明tempByte修复问题的原因是您现在正在每次迭代期间创建一个新的独立字节数组。您现在添加了多个不同的数组,而不是多次添加一个数组。

答案 2 :(得分:1)

您将多次添加相同的对象(tempByte数组)到incomingMesage列表。在每次迭代中,您都会覆盖此数组的内容。

如果你想存储这样的数据,你需要将tempByte复制到新数组,你将在列表中插入。