我自己定义一个类Edge
然后在定义一些对象Edge edge1,edge2,edge3...然后定义一个数组edges
edges = {edge1,edge2,edge3};现在我要定义一个数组edgeList。
edgeList的尺寸是edge的4倍那么大,存储的是
{edge1,edge2,edge3,edge1,edge2,edge3,edge1,edge2,edge3,edge1,edge2,edge3}
其实edgeList就是把数组edges重复4遍。但是,我发现当我改变edgeList数组的第2次出现的edge1的时候,edgeList数组的第1个元素edge1也同时变化。当我改变edgeList数组的第3次出现的edge1的时候,edgeList数组的第1、2次出现edge1也同时变化。
这是因为edgeList数组只是存储了edges {edge1,edge2,edge3}的地址,所以会发生“同步更改”。代码如下在二楼:

解决方案 »

  1.   

    public class ContRegion { Edge[] edgeList;
    int tempedges[][] = new int [8][15];   public ContRegion( Edge[] edges)
    {
    edgeList = new Edge[ 4 * edges.length];
    //如果edges.length==7,则edges长度为7,edgeList长度为28
    System.arraycopy(edges, 0, edgeList, 0, edges.length);//从这里开始把edgesedgeList拷贝给edgeList
    System.arraycopy(edges, 0, edgeList, edges.length, edges.length);//一共拷贝了4次
    System.arraycopy(edges, 0, edgeList, 2 * edges.length, edges.length);
    System.arraycopy(edges, 0, edgeList, 3 * edges.length, edges.length);//于是edgeList就把数组edges重复了4遍

    for(int i = 0; i <= edges.length-1; i ++)//edges里面的都是整型,所以可以把edges存储到数组tempedges中
    {
    //把edges所有的内容复制到整型数组tempedges里面
    tempedges[i][2] = edges[i].flow1;
    tempedges[i][3] = edges[i].flow2;
    tempedges[i][4] = edges[i].flow3;
    tempedges[i][5] = edges[i].flow4;
    tempedges[i][11] = edges[i].QoSlevel1;
    tempedges[i][12] = edges[i].QoSlevel2;
    tempedges[i][13] = edges[i].QoSlevel3;
    tempedges[i][14] = edges[i].QoSlevel4;
    }

    for(int i = 0; i <= edges.length-1; i ++)//以下4个for循环更改数组edgeList的部分内容
    {
    //edgeList[0]到edgeList[6]不变,因为前面执行了System.arraycopy函数
    //如果edges.length==7,那么edgeList[0]=edges[0],edgeList[2]=edges[2]edgeList[6]=edges[6] }

    for(int i = 0; i <= edges.length-1; i ++)
    {
    edgeList[edges.length + i].flow1 = tempedges[i][3];//把原来的flow2赋给flow1
    edgeList[edges.length + i].QoSlevel1 = tempedges[i][12];//把原来的QoSlevel2赋给QoSlevel1
                            //执行完这两句以后,edgeList[7]到edgeList[13]发生变化:edgeList[7到13].flow1等于edgeList[7到13].flow2
    //                                                     edgeList[7到13].QoSlevel1等于edgeList[7到13].QoSlevel2
    //但是,一旦执行完这两句以后,在上一个for循环里面的edgeList[0到6]的值也会随之发生变化
    //就仿佛System.arraycopy函数只是把edges的地址拷贝四次,拷贝给了edgeList
    }

    for(int i = 0; i <= edges.length-1; i ++)
    {
    //类似
    }
    for(int i = 0; i <= edges.length-1; i ++)
    {
    //类似
    }
    //于是,上面的4次循环里面,每次循环都改变前三次循环的结果:就仿佛System.arraycopy函数只是把edges的地址拷贝四次,拷贝给了edgeList
    //一旦改变了edgeList[28]就相当于改变了edgeList[0]和edgeList[7]和edgeList[14]
    }
      

  2.   

    我本来想用clone函数,但是clone只能把一个对象clone给另一个对象。
    我这里是把数组edges重复4遍复制给edgeList ====== ======= ====== ======