代码之家  ›  专栏  ›  技术社区  ›  Maleki

为什么更改整个数组行会产生奇怪的行为?

  •  2
  • Maleki  · 技术社区  · 16 年前

    简单地说。为什么过了一会儿我的代码就出故障了。

    //Color[][] colorArr = new Color[Width][Height]();
    
    private void shiftRowsDown(int row) {
        for (int i = row; i > 0; i--)
        {
            colorArr[i] = colorArr[i - 1];//<--This in particular
        }
        for (int col = 0; col < colorArr[0].length; col++) 
        {
            colorArr[0][col] = null;
        }
    }
    

    把它改成一个一个地手动改变是可以的。

    private void shiftRowsDown(int row) {
        for (int i = row; i > 0; i--) {
            for(int col = 0;col < colorArr[i].length;col++)
            {
            colorArr[i][col] = colorArr[i - 1][col];//<--This in particular
            }
        }
        for (int col = 0; col < colorArr[0].length; col++) 
        {
            colorArr[0][col] = null;
        }
    }
    
    1 回复  |  直到 16 年前
        1
  •  6
  •   Matthew Flaschen    16 年前

    您有一个数组数组,所以第一个代码将外部数组的两个元素设置为同一个内部数组。

    更简单的例子:

    Color[][] colors = new Color[2][2];
    colors[0] = new Color[]{Color.red, Color.blue}; // colors[0] holds a reference to an array object, located at, say, 0xcafebabe
    colors[1] = new Color[]{Color.orange, Color.yellow}; // Say color[1] a reference to an array at 0xdeadbeef
    

    所以你可以把颜色的记忆形象化如下:

    [0xcafebabe, 0xdeadbeef]
    

    如果你这样做:

    colors[1] = colors[0];
    

    它是:

    [0xcafebabe, 0xcafebabe]
    

    扩展结构现在是:

    {{Color.red, Color.blue}, {Color.red, Color.blue}}
    

    但这两行都引用了 相同的 数组,在 相同的 记忆位置。如果你这样做:

    colors[1][0] = Color.yellow;
    

    数组仍然是:

    [咖啡馆,咖啡馆]
    

    现在扩展的结构看起来是:

    {{Color.yellow, Color.blue}, {Color.yellow, Color.blue}}
    

    这也被称为 shallow copy .