添加新对象时运行时覆盖列表元素[重复]
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 中的运行时运行时会失败?