添加新对象时运行时覆盖列表元素[重复]

Posted

技术标签:

【中文标题】添加新对象时运行时覆盖列表元素[重复]【英文标题】: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) 【参考方案1】:

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

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

【讨论】:

该死,我怎么错过了.. 非常感谢!!

以上是关于添加新对象时运行时覆盖列表元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在调试时运行时如何禁用 Firebase 崩溃报告?

为啥 Kubernetes 的容器在 runsc (gVisor) 上作为 Docker 中的运行时运行时会失败?

使用ActiveSheet.Range时运行时错误13“类型不匹配”

表名正确时运行时错误3078

Algs4-1.4.41运行时间

将元素添加到null(空)List 财产[重复]