【问题标题】:Runtime overwriting List elements when adding new object [duplicate]添加新对象时运行时覆盖列表元素[重复]
【发布时间】:2020-10-11 04:41:04
【问题描述】:

我有实现Runnable 的任务,它需要使用扩展TimerTask 的自定义类填充ArrayList

我的代码:

public class ClusterSessionTask implements Runnable {
  @Override
  public void run() {
    CheckTask checkTask = null;
    Map<String, String> keyspaces = getKeyspaces(cluster_name);
    for (Map.Entry<String, String> key_to_colfam : keyspaces.entrySet()) {
      String k = key_to_colfam.getKey();
      String c = key_to_colfam.getValue();
      checkTask = new CheckTask(k, c, session);
      tasks.add(checkTask);
    }
  }
}

您可以看到我在 for 循环中的每次迭代都初始化了新的 CheckTask,但我仍然会覆盖列表中的先前元素。

查看此调试信息:

在第一次迭代中,您可以看到任务a:b

但是在第二个a:b 被新任务c:d 覆盖:

CheckTask 是一个扩展TimerTask 的类:

class CheckTask extends TimerTask {
  private static int i = 0;
  private static String keyspace;
  private static String colfam;
  private static CqlSession session;

  CheckTask(String k, String c, CqlSession s) {
    keyspace = k;
    colfam = c;
    session = s;
  }

  public void run() {
    ...
  }

  @Override
  public String toString() {
    return keyspace + ":" + colfam;
  }
}

我做错了什么?它以某种方式通过引用传递对象,而 new 推荐被忽略?

谢谢

【问题讨论】:

  • 什么是 CheckTask?
  • 抱歉 - 正在编辑相关信息。
  • 你的变量是静态的...
  • 我同意 assylias 的根本原因是你的变量是静态的,还要确保使用线程安全的数组列表(Collections.synchronizedList() 或 CopyOnWriteArrayList)

标签: java arraylist pass-by-reference


【解决方案1】:

问题是构造函数中keyspace,colfam,session的静态关键字。

即使您创建 2 个实例,它们也会共享相同的值

【讨论】:

  • 该死,我怎么错过了.. 非常感谢!!
猜你喜欢
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2015-10-02
  • 2015-10-14
相关资源
最近更新 更多