修改arraylist中的一个对象会更改其副本

时间:2018-12-20 11:01:25

标签: java android arraylist

我在Activity中有两个相同类的对象,例如 User 。我创建了两个对象 user editedUser 。为了避免相同的引用问题,我使用Google Gson从JSON字符串创建了这两个引用。这些类包含保存其他对象(例如,度数)的ArrayList。

我的问题是,当我更新 editedUser 的ArrayList中的Degree对象中的一个字段时,它也会自动反映在 user 对象中。如何避免这种情况?

这是我的代码

创建对象:

user = new Gson().fromJson(getIntent().getStringExtra("userdata"), User.class);
editedUser = new Gson().fromJson(getIntent().getStringExtra("userdata"), User.class);

我用这一行修改了它

editedUser.getDegrees().get(0).setTitle("Some Title");

此行也会更改 user 对象

2 个答案:

答案 0 :(得分:0)

两个Degrees对象必须是不同的实例,由两个new Degrees()创建(或独立的反序列化)。也许你做到了

User editedUser = new User();
editedUser.setDegrees(user.getDegrees());

如果这导致共享user的内部度,则完成getDegrees 危险地公开内部列表。

editedUser.getDegrees().addAll(user.getDegrees());

答案 1 :(得分:0)

简单。您做了一个浅表复制,即。列表是副本,它们引用完全相同的对象。在这种情况下,您需要做一个深拷贝,即。不只是复制列表,还复制其中的每个元素。