传递的ArrayList正在更新+ Java

时间:2013-03-29 02:00:04

标签: java arraylist

我有一个我现在无法弄清楚的问题。我有一个类作为Iframe,它具有变量“private List pathContainer”来维护Iframe的路径。

鉴于它的代码,

public class IFrame implements HtmlElement {

private WebElement elem;
private String xpath;
private boolean selected;
private String parentClass;
private boolean isProcessed=false;
private boolean isIframeContent=false;
private List <String> pathContainer;

    public IFrame(WebElement elem) {
    this.elem = elem;
    pathContainer=new ArrayList<String>();
}

我将父iframe的路径列表传递给子iframe,以将其包含在列表中。但是,当我修改子帧路径列表时,父Iframe路径列表也会被更改。给定是函数的代码,

public void LoadIFrameNodes(List<String> parentPath){
        IFrame iframe=new IFrame(e);
        List <String> tempPath=new ArrayList<String>();
        iframe.setPathContainer(parentPath); //assigning parent path in subIframe list
        tempPath=iframe.getPathContainer();
        tempPath.add(iframe.getXpath());  // add another value to subIframe
        iframe.setPathContainer(tempPath); //setting the changed list as the subIframe
   }

使用新值设置subIframe后,传递的parentPath列表也会随新值一起更改。我没有更新传递的列表。请告诉我哪里出错了?

4 个答案:

答案 0 :(得分:3)

iframe.setPathContainer(parentPath); //assigning parent path in subIframe list
tempPath=iframe.getPathContainer();

除非那些获取者/制定者制作防御性副本(通常他们没有),否则tempPath只会指向与parentPath相同的对象。

在更新之前,您需要复制一份清单。

 final List<String> tempPath=new ArrayList<String>(parentPath);
 tempPath.add(iframe.getXpath());  
 iframe.setPathContainer(tempPath);

答案 1 :(得分:1)

在Java中,当传递的对象发生更改时,即使方法返回,更改也会持久。当您将iframe的pathcontainer设置为parentPath,然后将路径退出时,您将获得对同一parentPath的引用。当你改变它时,它会持续存在。如果你不想要这个,请复制一份。

您可以通过电话

执行此操作
List<String> tempPath = new ArrayList<String>(parentPath);
iframe.setPathContainer(tempPath);

答案 2 :(得分:1)

问题是你有几个指向同一个对象的引用变量。我建议你做一些研究,以了解参考变量的工作原理。

要解决此问题,您需要在将List传递给方法之前或之后立即复制List。

答案 3 :(得分:0)

您需要制作列表的副本或以不同方式传递信息,因为每个引用都指向原始信息,因此您所做的任何更改都会影响原始信息。

StackOverflow有几个克隆arraylists的例子:

clone(): ArrayList.clone() I thought does a shallow copy

ArrayList shallow copy iterate or clone()

How to clone ArrayList and also clone its contents?