为什么清除arraylist即使在完全分配值之后也清除了另一个arraylist?

时间:2015-09-26 13:00:10

标签: java xml arraylist xml-parsing

我创建了两个列表。第一个列表是某种类型(Syncgroupset),第二个列表是字符串类型的arraylist。此syncgroupset类包含list类型的arraylist的getter和setter。

我将解析xml并将解析后的值复制到类的列表类型(syncgroupset)。

请找到如下的xml。

<syncgroupsettings>
        <syncgroupset id = "sgMS" labelid = "lblMS" enabled = "YES" default = "OFF">
            <syncgroup syncgroupname = "VISITS"/>
            <syncgroup syncgroupname = "CUSTOMERS"/>
        </syncgroupset>

        <syncgroupset id = "sgAS" labelid = "lblAS" enabled = "YES" default = "ON">
            <syncgroup syncgroupname = "SALESDOCS"/>
            <syncgroup syncgroupname = "ANALYTICS"/>
        </syncgroupset>
    </syncgroupsettings>

请找到以下代码

public List<Syncgroupset> parse(XmlPullParser parser) {
        String id = "";
        String synlabelid="";
        String enabled = "";
        String default1 = "";
        String syngroupname = "";

        List<Syncgroupset> mysynset = new ArrayList<Syncgroupset>();

        try {
            int eventType = parser.getEventType();

            List<String> mysyname = new ArrayList<String>();

            while (eventType != XmlPullParser.END_DOCUMENT) {
                String tagname = parser.getName();
                switch (eventType) {
                    case XmlPullParser.START_TAG:
                        if(tagname.equalsIgnoreCase("labels"))
                        {
                            skip(parser);

                        }else
                        if (tagname.equalsIgnoreCase("syncgroupsettings")) {
                            // do nothing
                        }else
                        if (tagname.equalsIgnoreCase("syncgroupset")) {
                            syncgroupset = new Syncgroupset();
                            id = parser.getAttributeValue(ns,"id");
                            synlabelid = parser.getAttributeValue(ns,"labelid");
                            enabled = parser.getAttributeValue(ns,"enabled");
                            default1 = parser.getAttributeValue(ns,"default");
                            syncgroupset.setLabelid(synlabelid);
                            syncgroupset.setEnabled(enabled);
                            syncgroupset.setDefault(default1);
                            syncgroupset.setId(id);
                            mysynset.add(syncgroupset);
                        }else
                        if(tagname.equalsIgnoreCase("syncgroup"))
                        {
                            syngroupname = parser.getAttributeValue(ns,"syncgroupname");
                            mysyname.add(syngroupname);
                        }
                        break;

                    case XmlPullParser.TEXT:
                        break;

                    case XmlPullParser.END_TAG:
                        if (tagname.equals("syncgroupset")) {
                            mysynset.get(mysynset.size() - 1).setSyncgroup(mysyname);
                            mysyname.clear();
                        }
                        break;

                    default:
                        break;
                }
                eventType = parser.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return mysynset;
    }

当我遇到syncgroup标记时,我将把值复制到其他类型字符串列表中。我不是仅在此处将同步组值添加到类型类列表中。

当我遇到syncgroupsetting的结束标记时,只有我通过替换将类型字符串列表添加到类型列表中。

然后我清除了字符串类型列表。当我这样做时,它甚至清除了列表中的列表。能不能让我知道我在哪里做错了。

1 个答案:

答案 0 :(得分:2)

似乎Syncgroupset保留了您使用setSyncgroup(list)传递给它的列表的浅表副本。这就是为什么list.clear()也会影响Syncgroupset的原因。

更改此行:

mysynset.get(mysynset.size() - 1).setSyncgroup(mysyname);

对此:

mysynset.get(mysynset.size() - 1).setSyncgroup(new ArrayList<String>(mysyname));

那样,它不会mysyname传递给它, 但是复制了mysyname所有元素的全新列表, 然后mysyname.clear()不会影响通过setSyncgroup调用传递的列表。