Skip to content
Advertisement

Data in the List gets modified after changing the object in another List

After adding the object into my list I am changing the data in the list it is getting modified I have the code like

List<Data> oldList = // initializing the list
List<Data> newList = // initializing the list

for (Data data: oldList) {
    if (condition) {
        data.setvalue("");
        newList.add(data);
        data.setAnother();
    }
}

If I am doing like this, the data object in the newList also is getting changed.

I have a requirement that it should be changed in the oldList but it should not change the data in the newList.

Advertisement

Answer

If you don’t want the objects in the newList get affected while changing the object from the oldList, then need to create a copy of each object that should be added to the newList.

For that, you can implement a copy-constructor (a constructor that expects an object of the same type as an argument) in the Data class or make it implement Clonable interface (but this approach has some serious pitfalls see here – paragraph “Copy Constructor versus Cloning”).

Assuming that you’ve implemented a copy-constructor, your code might be written like this:

List<Data> oldList = // initializing the list
List<Data> newList = // initializing the list
    
for (Data data: oldList) {
    if (condition) {
        Data copyForNewList = new Data(data); // creating a copy of the data object
        copyForNewList.setvalue("");          // changing the copy
        newList.add(copyForNewList);          // string the copy
        data.setAnother();                    // mutating the original object
    }
}
Advertisement