Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么变量会影响其他arraylist';以前估价过多少?_Java_Arraylist - Fatal编程技术网

Java 为什么变量会影响其他arraylist';以前估价过多少?

Java 为什么变量会影响其他arraylist';以前估价过多少?,java,arraylist,Java,Arraylist,我有大量的代码,所以我不能复制所有的代码,对此我很抱歉 但我得到了一些重要的部分 我有一个可以获取值“0”或“1”的类“Box”,还有一个是“Box”的数组列表的“Box” 代码中的内容一直在更新。我还有另一个类“state”,它是一个数组列表“Box”和 其他一些东西,我想用它来回溯 我们可以把“盒子”当作程序的映射,把“状态”保存在盒子里。 因此,我有一个名为“states”的“state”数组列表,用于保存代码执行过程中每个步骤中生成的所有“box”,以便在必要时返回 我有一个方法来评估盒

我有大量的代码,所以我不能复制所有的代码,对此我很抱歉

但我得到了一些重要的部分

我有一个可以获取值“0”或“1”的类“Box”,还有一个是“Box”的数组列表的“Box”

代码中的内容一直在更新。我还有另一个类“state”,它是一个数组列表“Box”和

其他一些东西,我想用它来回溯

我们可以把“盒子”当作程序的映射,把“状态”保存在盒子里。

因此,我有一个名为“states”的“state”数组列表,用于保存代码执行过程中每个步骤中生成的所有“box”,以便在必要时返回

我有一个方法来评估盒子,我在while循环中调用它

我不明白为什么当我创建“state”的新实例并向其中添加当前的“box”时,“state”的值会随着代码中“box”的更改而更改

甚至我在“while循环”中创建自变量“state st2”来检查发生了什么,我看到“st2”也在变化。并在代码开始时只对其求值一次

state st1 = new state();
st1.setBoxes(boxes); 
换句话说,我们在“状态”中有一些“状态”,它们都会更改为最后一个状态,并且无法保存自己的值

为了更好的合作

首先,我添加了一个状态

st1
在“美国”

下次我在“状态”中添加另一个“状态”,如“st2”

我有

st2 , st2
下次:

st3 , st3 , st3
我怎样才能修好它

我还创建了“Box”的新“ArrayList”,并将“Box”分配给它,但不起作用

我还在每个步骤中创建新的“状态”,但这也不起作用。 有人能帮我修吗? 如果您对我的问题有任何歧义或误解,请发表评论,我会回答。 如果你有更好的方法,请告诉我


谢谢

所有对象变量都是引用。它们是藏宝图。当你写作时:

List<String> x = new ArrayList<String>();
记住,x是一张通往宝藏的藏宝图。它本身不是宝藏。因此,这将复制您的藏宝图并将其交给
setBoxes
方法。不过,它根本就不是宝箱的复制品。两张地图,但它们指向同一个地方。如果设置框为:

public void setBoxes(List<Box> boxes) {
    this.boxes = boxes;
}
点(
)是解引用操作符:“遵循此映射并向下挖掘”操作符。因此,每个人都可以看到这一新增内容——毕竟,每个人都有一张指向同一宝藏的地图。如果其他人随后跟随他们的副本,他们会到达同一个宝箱,这样他们就会看到Hello被添加到宝箱中

解决方案是开始复制宝藏,而不仅仅是地图:

List<Box> copy = new ArrayList<Box>();
copy.addAll(boxes);
List copy=new ArrayList();
副本。添加所有(框);

现在你有两个宝藏,每个都一样<代码>框是其中一个框的映射
copy
是一个映射到另一个的映射。

在使用英语时,如果正确使用大写字母,则更容易理解。@NomadMaker yes:)))对不起,谢谢你的完整解释。我试过了,但我认为问题是,当“box”被更改时,所有的“state.box”也会被更改。在将它们添加到“状态”之前,我为它们中的每一个创建了新的副本列表,并为每个步骤创建了新的“状态”。如何解决此问题?如果您实际上正在制作副本,则更改其中一个副本不会影响其他副本。检查复制代码。确保它是正确的。是的,我肯定这是我的错误,但当我创建副本列表时,它再次引用了主“框”。非常感谢,你太棒了
boxes.add("Hello");
List<Box> copy = new ArrayList<Box>();
copy.addAll(boxes);