Collection中有一个对象不是静态的吗?

时间:2011-07-22 21:23:48

标签: java collections static arraylist

我已经搜索过,但我没有找到一个好的答案。

我使用了一个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是不是静态的?

3 个答案:

答案 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.visitedonetimevisit都是指向内存中同一对象的引用。

另一方面,ArrayList有一些类似于复制构造函数的东西。在上面的示例代码中调用的这个构造函数创建了给定ArrayList的浅表副本,这似乎是您想要的。值得注意的是ArrayList不会复制添加到它的对象(它存储对它们的引用),所以你真正需要的也是创建对象的副本。这可以通过在将它们插入ArrayList之前调用它们的复制构造函数(如果它们允许通过提供这样的构造函数进行复制)来完成。