【问题标题】:Is there an object in Collection isn't static?Collection 中有一个对象不是静态的吗?
【发布时间】:2011-07-22 21:23:48
【问题描述】:

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

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

【问题讨论】:

  • 向我们展示您的实际代码并告诉我们您想要它做什么
  • 一些代码在这种情况下真的很有帮助。
  • 你的目标是什么,试着用干净的方式询问并给出示例代码

标签: java collections static arraylist


【解决方案1】:

我猜您的问题与关于 java 如何在方法调用中将对象作为参数传递的错误假设有关。看看这个答案:Is Java "pass-by-reference" or "pass-by-value"?

【讨论】:

    【解决方案2】:

    简答:

    改变

    this.visited = onetimevisit;
    

    this.visited = new ArrayList (onetimevisit);
    

    更长的答案:

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

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

    【讨论】:

    • @afni:列表in的对象仍然是共享的,即使在复制之后!如果您有一个用户列表,并且您传递了一个副本(使用 new ArrayList(oldUsers)),并且您更改了用户名,那么所有列表都将看到更新后的名称。
    • @extraneon- 是的。我已经尝试过了,但我现在知道这个概念和我的错误。
    【解决方案3】:

    如果您想要new ArrayList(),您必须创建一个,它不会自动完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 2018-02-25
      • 2014-10-10
      • 1970-01-01
      相关资源
      最近更新 更多