Java 集合中是否有对象isn';不是静态的吗?

Java 集合中是否有对象isn';不是静态的吗?,java,collections,static,arraylist,Java,Collections,Static,Arraylist,我搜索过了,但没有找到一个好答案 我使用了一个ArrayList对象。我创建了一个实例对象(示例对象X),我使用该ArrayList作为构造函数对象X的参数,但每次我创建对象X的实例时,ArrayList都包含旧值,而没有创建新的ArrayList 我需要使用像arraylist这样的add方法。代码如下: public DataPacket(int hop, int TTL, ArrayList onetimevisit){ this.hop = hop; th

我搜索过了,但没有找到一个好答案

我使用了一个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;
 }
在其他循环过程中,数据包将满足对象节点域:

public NodeRandom(int id){
        this.id = id;
}
然后数据包将添加节点域的id


集合中是否有一个对象不是静态的?

如果你想要一个
新的ArrayList()
你必须创建一个,它不会自动创建。

如果你想要一个
新的ArrayList()
你必须创建一个,它不会自动执行。

我猜您的问题与java如何在方法调用中将对象作为参数传递的错误假设有关。看看这个答案:

我猜您的问题与java如何在方法调用中将对象作为参数传递的错误假设有关。查看以下答案:

简短答案:

改变

this.visited = onetimevisit;

更长的回答:

ArrayLists
不一定是静态的
。我认为您错误地推断,
ArrayList
必须以某种方式设置为静态,因为当您以传递方式传递它时,
ArrayList
只有一个副本。需要理解的是,当您在Java中传递一个对象(例如,
ArrayList
)时,您传递的是对该对象的引用。引用类似于C风格的指针,其区别在于不允许使用指针算术等。当您调用一个方法并传递一个对象时,被调用的方法只获取引用的副本,而不是对象的副本。同样,当您使用=操作符将一个对象指定给另一个对象时,您仅将引用指定为彼此相等,并且仍然只有该对象的一个副本。在代码中,
this.visitored
onetimevisit
都是指向内存中相同对象的引用


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

改变

this.visited = onetimevisit;

更长的回答:

ArrayLists
不一定是静态的
。我认为您错误地推断,
ArrayList
必须以某种方式设置为静态,因为当您以传递方式传递它时,
ArrayList
只有一个副本。需要理解的是,当您在Java中传递一个对象(例如,
ArrayList
)时,您传递的是对该对象的引用。引用类似于C风格的指针,其区别在于不允许使用指针算术等。当您调用一个方法并传递一个对象时,被调用的方法只获取引用的副本,而不是对象的副本。同样,当您使用=操作符将一个对象指定给另一个对象时,您仅将引用指定为彼此相等,并且仍然只有该对象的一个副本。在代码中,
this.visitored
onetimevisit
都是指向内存中相同对象的引用


另一方面,
ArrayList
有点类似于复制构造函数。在我上面的示例代码中调用的这个构造函数创建了给定的
ArrayList
的一个浅拷贝,这似乎就是您想要的。值得注意的是,
ArrayList
不会复制添加到其中的对象(它存储对这些对象的引用),因此可能您真正需要的是创建对象的副本。这可以通过调用他们的复制构造函数来实现(如果他们通过提供这样的构造函数来允许复制)在将它们插入
ArrayList

之前,请向我们展示您的实际代码,并告诉我们您希望它做什么。某些代码在这种情况下确实有帮助。您的目标是什么?请尝试以干净的方式提问并给出示例代码。向我们展示您的实际代码,并告诉我们您希望它做什么。某些代码在这种情况下真正有帮助。您的目标是什么试着以一种干净的方式提问并给出样品code@afni:即使在复制之后,列表中的对象仍然是共享的!如果您有一个用户列表,并且您传递了一个副本(使用new ArrayList(oldUsers)),并且您更改了用户的名称,所有列表都将看到更新的名称。@extraneon-是。我已经试过了,但是我现在知道了这个概念和我的错误。@afni:列表中的对象仍然是共享的,即使在复制之后!如果您有一个用户列表,并且您传递了一个副本(使用new ArrayList(oldUsers)),并且您更改了用户的名称,所有列表都将看到更新的名称。@extraneon-是。我试过了,但我现在知道了这个概念和我的错误。