我已经搜索过,但我没有找到一个好的答案。
我使用了一个ArrayList对象。我创建了一个实例对象,(示例对象X),我使用ArrayList作为构造函数对象X的参数,但每次创建对象X的实例时,ArrayList都包含旧的值,没有创建新的ArrayList。
我需要使用像arraylist这样的add方法。这是代码:
public DataPacket(int hop, int TTL, ArrayList onetimevisit){
this.hop = hop;
this.TTL = TTL;
this.visited = onetimevisit;
}
在其他循环过程中,DataPacket将满足对象NodeRandom:
public NodeRandom(int id){
this.id = id;
}
然后DataPacket将添加NodeRandom的id。
Collection中的Object是不是静态的?
答案 0 :(得分:4)
我会猜测你的问题与关于java如何将对象作为方法调用中的参数传递的错误假设有关。看看这个答案:Is Java "pass-by-reference" or "pass-by-value"?
答案 1 :(得分:1)
如果你想要new ArrayList()
,你必须创建一个,它不会自动完成。
答案 2 :(得分:1)
简答:
变化
this.visited = onetimevisit;
到
this.visited = new ArrayList (onetimevisit);
更长的回答:
ArrayLists
不一定是static
。我认为你错误地推断ArrayList
必须以某种方式设置为静态,因为当你以传递它的方式传递它时,ArrayList
只有一个副本。要理解的是,当您使用Java传递对象(例如ArrayList
)时,您将引用传递给对象。引用类似于C风格的指针,区别在于不允许指针算术等。当您调用方法并传递对象时,被调用的方法只获取引用的副本,而不是对象的副本。同样,当您使用=运算符将一个对象分配给另一个对象时,您只是将引用指定为彼此相等,并且仍然只有该对象的一个副本。在您的代码中,this.visited
和onetimevisit
都是指向内存中同一对象的引用。
另一方面,ArrayList
有一些类似于复制构造函数的东西。在上面的示例代码中调用的这个构造函数创建了给定ArrayList
的浅表副本,这似乎是您想要的。值得注意的是ArrayList
不会复制添加到它的对象(它存储对它们的引用),所以你真正需要的也是创建对象的副本。这可以通过在将它们插入ArrayList
之前调用它们的复制构造函数(如果它们允许通过提供这样的构造函数进行复制)来完成。