Java 为什么本地ArrayList会更改?

Java 为什么本地ArrayList会更改?,java,arraylist,Java,Arraylist,我有一个奇怪的错误,我无法修复。有人能帮我吗?多谢各位 ArrayList<Choices> newSecurityChoicesList = securityChoicesController.getChoicesList(); System.out.println("first-" + newSecurityChoicesList.size()); securityQuestion.getChoices().clear(); System.out.println("sec

我有一个奇怪的错误,我无法修复。有人能帮我吗?多谢各位

ArrayList<Choices> newSecurityChoicesList =
    securityChoicesController.getChoicesList();
System.out.println("first-" + newSecurityChoicesList.size());
securityQuestion.getChoices().clear();
System.out.println("second-" + newSecurityChoicesList.size());
一些解释:

我创建了这个newSecurityChoicesList数组列表。它是方法中的局部变量。 第一次系统打印结果为2

为什么第二次打印结果为0

当然,这是因为securityQuestion.getChoices.clear;方法 但是为什么一个方法可以改变一个方法中的局部变量呢?此方法仅在应用程序的最后调用一次


提前感谢。

您正在处理一个引用变量并更改它引用的对象的属性。因此,虽然方法的局部变量是局部变量,但它将引用传递给方法的对象。同样,这不是Java中的错误,而是理解引用变量时的问题


如果不想更改传递到方法中的ArrayList的状态,请在使用它之前在方法中对其进行深度复制。换句话说,您需要创建一个新的ArrayList,然后遍历参数ArrayList,在将其添加到新列表之前复制原始列表中的每个项目。

是因为ArrayList是通过引用保存的,因此,您正在通过两个引用修改同一个对象-一个作为局部变量,另一个在securityQuestion对象中

,并且83.62%的统计数据是当场生成的。为什么要对一个合法的初学者问题进行否决投票?理解通过引用和通过值之间的差异是任何程序员教育的关键部分。我认为反对票即将到来,因为他可能无意中提到,他认为错误在Java中,而不是在他对Java的理解中。他可能想重新表述他原来的问题,以消除这种可能的解释。注意,我对这个问题投了赞成票。@Ismet,什么态度?我的观点是:,如果你注意到的话,几乎所有作为BUG发布的东西都是程序员犯的错误。这不是有意的态度。人身攻击是怎么回事?@IsmetAlkan,如果你在指责他们没有帮助之前先看看他们的代表,你可能会学到一些东西。我在这里回答了不止一个问题,并为新程序员提供了很多帮助。你可能会轻松一点,获得一点幽默感注意这个微笑——这不是讽刺,以防你不确定。你可能还注意到我之前也给你提了一个有用的建议。或者getChoices可以在返回列表之前将其包装起来。哦,我明白你的意思了。所以你说securityChoicesController.getChoicesList;在此过程中被修改,因此newSecurityChoicesList只是对对象?的引用?。。非常感谢。@TheJAVANoob:是的,newXXX变量引用原始对象。按照DavidMarkness的建议或在getChoicesList方法中,返回列表的深度副本。