java - 为什么在Arraylist复制的时候修改,修改的是原来的呢?

标签 java arraylist cloneable

我正在尝试将 ArrayList 的内容复制到另一个并更改副本的内容。我不希望这反射(reflect)在原件中。

我检查了SO并做了相应的更改,仍然是同样的问题。有人可以帮忙吗?我分享以下代码:

private ArrayList<CustVoiceListObject> FilterApprovedWorkFromList() {

        ArrayList<CustVoiceListObject> arrayListCopy = new ArrayList<>(arrayListCustVoice);

            for(int i =0; i<arrayListCopy.get(position).getPackageArray().size();i++)
            {
                if(!arrayListCopy.get(position).getPackageArray().get(i).getPackageApproved().equals("Y"))
                {
                    arrayListCopy.get(position).getPackageArray().remove(i);
                    i--;
                }
            }
        return arrayListCopy;
    }

在调试的时候,快要返回的时候,我查看了原来的arraylist arrayListCustVoice不过这个也修改类似arrayListCopy

我错过了什么?

更新 [遵循建议][这个问题因此不重复!]

这是我修改后的代码:

 private ArrayList<CustVoiceListObject> FilterApprovedWorkFromList() {

        ArrayList<CustVoiceListObject> arrayListCopy = (ArrayList<CustVoiceListObject>) arrayListCustVoice.clone();

            for(int i =0; i<arrayListCopy.get(position).getPackageArray().size();i++)
            {
                if(!arrayListCopy.get(position).getPackageArray().get(i).getPackageApproved().equals("Y"))
                {
                    arrayListCopy.get(position).getPackageArray().remove(i);
                    i--;
                }
            }
        return arrayListCopy;
    }

事实上,我已经在原来的类中实现了 Cloneable,但我仍然面临同样的问题。

更新2 [研究结论]

我遇到了这个link

就我而言,有 2 个类。第二个是第一个的子集。粘贴如下:

public class CustVoiceListObject implements Cloneable {

    private String txtSource, txtCustComment, txtCustOk, txtRepeat;

    private int numberOfPackages, complaintSerial;

    private ArrayList<CustomerVoicePackageListObject> packageArray;

    private Double totalAmount;

   //getters & setters & constructors

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }


}

第 2 类:

public class CustomerVoicePackageListObject implements Cloneable {

    public String packageCategory;
    public String packageName;
    public String partUsageFlag;
    public String laborUsageFlag;
    public String status;
    public String isApproved;

 //getters & setters & constructors

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

.clone()必须链接到clone()类的,而不是其他地方的。如果正确的话,它将促使我按照我在每个单独的类中实现clone()的方式采取措施来解决异常。

这就是我所做的,将 for 循环修改为:

 private CustVoiceListObject FilterApprovedWorkFromList() {

//Observe the change here. It's no more ArrayList, it's Class type
        CustVoiceListObject arrayListCopy = null;
        try {
            arrayListCopy = (CustVoiceListObject) arrayListCustVoice.get(position).clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        for(int i =0; i<arrayListCopy.getPackageArray().size();i++)
            {
                if(!arrayListCopy.getPackageArray().get(i).getPackageApproved().equals("Y"))
                {
                    arrayListCopy.getPackageArray().remove(i); //this is ArrayList<ClassType>. Nested class objects.
                    arrayListCopy.setTxtCustOk("OKOK"); //within the class
                    i--;
                }
            }
        return arrayListCopy;
    }

结果是 packageArray 中的更改反射(reflect)在两个(失败)中,但是,基本类中 txtCustOk 中的更改,在副本中更改,而不是在原始中更改(成功)。这意味着问题出在使用 ArrayList 进行克隆

因此深度克隆需要满足以下规则:

1.No need to separately copy primitives.

2.All the member classes in original class should support cloning and in clone method of original class in context should call super.clone() on all member classes.

3.If any member class does not support cloning then in clone method, one must create a new instance of that member class and copy all its attributes one by one to new member class object. This new member class object will be set in cloned object.

所以我的目标是摆脱 ArrayList 并将这些元素转移到此类。这很痛苦。寻找一个简单的替代方案。

最佳答案

问题是原始 ArrayList 的元素是引用值,因此您只需复制对这些对象的引用,而不是对象本身(这似乎是另一种数组)。

看看this本质上涉及同一类问题的问题。

关于java - 为什么在Arraylist复制的时候修改,修改的是原来的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37881163/

相关文章:

java - 重新编码从可调用返回值的 future

java - ArrayList<HashMap<String, String>> 无法正确转换为 API9 的 JSONArray

java - 如何删除ArrayList中与原始元素重复的值

java - 为什么 CopyOnWriteArraySet 不实现 Cloneable 接口(interface),而 CopyOnWriteArrayList 实现?

java - 使用函数创建多个组件并自动换行[Java]

java - JSON 和 XML 不匹配

条件空检查时的 Java NullPointerException

java - 如何使用 ListIterator 编辑列表内容

java - Cloneable 抛出 CloneNotSupportedException