java - 为什么变量会影响之前评估过的其他数组列表?
问题描述
我有大量代码,所以我无法复制所有代码,对此我很抱歉。
但我得到了一些重要的部分。
我有一个可以获取值 '0' 或 '1' 的类 'Box' 并且我有 'boxes' 是 'Box' 的数组列表
一直在代码中更新。我有另一个类“状态”,它是“盒子”的数组列表和
其他一些东西,我想用它来回溯。
我们可以将“boxes”视为程序的映射,并在其中保存“boxes”的“state”。
所以我有一个名为“states”的“状态”数组列表来保存所有“框”,这些“框”是在代码期间的每个步骤中制作的,以便在必要时返回。
我有一个评估盒子的方法,我在一个while循环中调用它。
我不明白为什么当我创建“状态”的新实例并向其添加当前的“框”时,“状态”的值会随着代码中“框”的变化而变化!!!!
即使我从“while循环”中创建了自变量“state st2”来检查发生了什么,我也看到“st2”也在发生变化。并在代码的第一次对其进行评估。
state st1 = new state();
st1.setBoxes(boxes);
换句话说,我们在“状态”中有一些“状态”,它们都变为最后一个状态并且无法保存自己的值。
为了更好的概念
起初我添加了一个状态
st1
在“状态”
下次我将另一个“状态”(如“st2”)添加到“状态”时
我有
st2 , st2
下次:
st3 , st3 , st3
我该如何解决?
我还创建了“Box”的新“ArrayList”并将“boxes”分配给它但不工作。
我还在每个步骤中创建了新的“状态”,但这也不起作用。任何机构可以帮助我解决它?如果您对我的问题评论有任何歧义或错过理解,我会回答。如果你有更好的方法请告诉我。
谢谢
解决方案
所有对象变量都是引用。它们是藏宝图。当你写:
List<String> x = new ArrayList<String>();
然后new ArrayList<String>()
创造新的宝藏并将其埋在沙子里。List<String> x
描述了您创建的藏宝图,=
中间的表示 x 现在是您刚刚埋藏的宝藏的地图。x 是地图的名称,而不是宝藏的名称。宝物无名。
setBoxes(x);
请记住,x 是一张通往宝藏的藏宝图。它本身并不是宝藏。因此,这会复制您的藏宝图并将其交给该setBoxes
方法。但是,它根本不会复制宝箱。2张地图,但它们通向同一个地方。如果 setBoxes 是:
public void setBoxes(List<Box> boxes) {
this.boxes = boxes;
}
然后你调用 setBoxes 的对象有一个字段,而且,在 java 中,它都是藏宝图。那个领域现在也是一张地图……仍然是同一个宝藏。如果你多制作一堆这些物品,那么它们都有自己的藏宝图副本,但所有地图都指向同一个宝藏。因此,如果其中一个这样做:
boxes.add("Hello");
好吧,点 ( .
) 是取消引用运算符:“跟随此地图并向下挖掘”运算符。因此,每个人都可以看到这个添加——毕竟每个人都有一张指向同一个宝藏的地图。如果其他人后来跟随他们的副本,他们会到达同一个宝箱,因此他们会看到 Hello 已添加到其中。
解决方案是开始复制宝藏,而不仅仅是地图:
List<Box> copy = new ArrayList<Box>();
copy.addAll(boxes);
现在你有两个宝藏,每个都是一样的。boxes
是其中之一的地图。copy
是另一个地图。
推荐阅读
- c++ - 在函数中转换为模板类
- gitea - CreateOrAppendToCustomConf() [F] 未能创建 '/etc/gitea/app.ini': mkdir /etc/gitea: 权限被拒绝
- python - TypeError:源对象必须是表面
- android - Divider 颜色 DatePicker Android
- python - 单击“查看”按钮时出现此 Django 错误 MultiValueDictKeyError
- google-apps-script - 如何使用谷歌应用程序脚本中的另一个函数停止一个函数?
- stream - 使用 CheckedInputStream/CheckedOutputStream 压缩/解压缩时校验和不匹配
- r - 如何对 R 执行 Wald 检验以显示参数对总体的影响?
- bash - CloudFormation UserData 模板用于在 EC2 的配置文件中写入 RDS 端点
- elasticsearch - Kibana 增强表 - 计算列