我自己定义一个类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}的地址,所以会发生“同步更改”。代码如下在二楼:
然后在定义一些对象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}的地址,所以会发生“同步更改”。代码如下在二楼:
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]
}
我这里是把数组edges重复4遍复制给edgeList ====== ======= ====== ======