首页 > 解决方案 > 为什么变量会影响之前评估过的其他数组列表?

问题描述

我有大量代码,所以我无法复制所有代码,对此我很抱歉。

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

我有一个可以获取值 '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”分配给它但不工作。

我还在每个步骤中创建了新的“状态”,但这也不起作用。任何机构可以帮助我解决它?如果您对我的问题评论有任何歧义或错过理解,我会回答。如果你有更好的方法请告诉我。

谢谢

标签: javaarraylist

解决方案


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

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是另一个地图。


推荐阅读