添加新对象时运行时覆盖列表元素

Runtime overwriting List elements when adding new object

我有任务实现 Runnable,需要使用扩展 TimerTask.

的自定义 class 填充 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 是 class 扩展 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 推荐被忽略?

谢谢

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

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