如何把一个存储对象的数组复制到另一个数组里面?

fb8fb8 2008-12-09 02:56:53
我自己定义一个类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}的地址,所以会发生“同步更改”。

代码如下在二楼:
...全文
472 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
fb8fb8 2008-12-09
  • 打赏
  • 举报
回复
我本来想用clone函数,但是clone只能把一个对象clone给另一个对象。
我这里是把数组edges重复4遍复制给edgeList

====== ======= ====== ======
fb8fb8 2008-12-09
  • 打赏
  • 举报
回复
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]
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧