我正在研究一个保存和调用屏幕状态的系统,这是我第一次搞这样的东西,所以我不确定最好的东西有关这方面的方法是,但我现在将所有“PreviewMonitor”对象(大约40左右)存储在数组列表中。问题是,当我创建一个名为“allPreviewMonitors”的ArrayList的副本时,我最终得到一个ArrayList,其元素在更新原始元素时不断变化。这几乎就好像我正在处理原始的ArrayList,事实上,当我创建allPreviewMonitors的副本时,它应该是一个完全不同的ArrayList,其中包含元素及其状态的“冻结”版本。为什么会发生这种行为?如果需要,我可以显示代码,但我不确定这是否需要。ArrayList的副本不断修改为原始的值
回答
您只是将对象引用复制到ArrayList中。你需要自己复制对象。
在Java中,所有对象变量实际上都是引用变量。因此,代码:
Myclass myObject = new Myclass();
Myclass otherObject = myObject;
创建一个对象MYCLASS并存储在参考变量myObject
该MYCLASS对象的引用。然后它创建一个新的参考变量otherObject
,并将参考数据(例如存储器地址)从myObject
复制到otherObject
。这些现在指的是内存中的同一个对象。在这一点上,该行
myObject.myMethod();
有你在你的ArrayList中获得什么相同的结果
otherObject.myMethod();
是同一对象的不同引用。 你想要的是下列之一:
Myclass otherObject = myObject.clone(); // use the clone function
// OR
Myclass otherObject = new Myclass(myObject); // use a copy constructor
如果你把你的对象为使用clone()
或拷贝构造函数,你的ArrayList将包含,以相同的拷贝引用,而不是引用相同的副本ArrayList中。
正如其他人所指出的那样,只是把引用的副本被称为“浅拷贝”,同时使被称为被称为“深拷贝”
一个Arraylist
像所有Collections
,只包含对象的引用。 仅复制列表是不够的,您还必须在创建列表的副本时克隆()元素(或创建新元素,或使用复制构造函数)。
这称为制作“深度复制”,而您目前有一个“浅复制”。
对象的副本究竟是如何去有关“克隆”PreviewMonitor对象。我认为这可能是问题,所以我创建了一些东西来测试它,并在PreviewMonitor对象中创建了一个“克隆”方法,因为我认为它应该创建,但我不太确定如果我做对了。 public PreviewMonitor clone(){return this; } –
您需要确保您执行“深度复制” - 即克隆PreviewMonitor
对象。默认情况下,你只需做一个浅拷贝并复制对同一个对象的引用。
我如何去“克隆”PreviewMonitor对象。我认为这可能是问题,所以我创建了一些东西来测试它,并在PreviewMonitor对象中创建了一个“克隆”方法,因为我认为它应该创建,但我不太确定如果我做对了。 \t public PreviewMonitor clone(){ \t \t return this; \t} –
我假设'PreviewMonitor'是你自己的对象之一。克隆过程取决于对象。你通常会调用clone()方法。有更多信息在http://en.wikipedia.org/wiki/Clone_(Java_method)。 – Andrew
要克隆,您不能只返回当前对象。您必须创建一个与当前对象具有相同值的新对象。换句话说,使用当前对象的类的构造函数并创建一个新对象。确保旧对象和新对象之间的属性匹配。返回新对象并重复原始列表中的每个对象。
我已经试过both'code” \t \t为(PreviewMonitor sourcePreviewMonitor:previewMonitors){ \t \t \t this.previewMonitors.add(新PreviewMonitor(sourcePreviewMonitor.getPos(),sourcePreviewMonitor.getJButton()的getX(),sourcePreviewMonitor.getJButton。 () \t \t \t \t \t .getY(),sourcePreviewMonitor.getJButton()。的getWidth(),sourcePreviewMonitor.getJButton()。的getHeight(),sourcePreviewMonitor.getColumn(), \t \t \t \t \t sourcePreviewMonitor.getRow() ,sourcePreviewMonitor.getRight())); \t \t} - 然后为PreviewMonitor对象创建一个新的构造函数,使其获得一个参数,另一个PreviewMonitor并将其传入。 –
- 1. Javascript - 在不修改原始数组的情况下修改数组副本
- 2. 保持原始Vector完好当修改它的副本
- 3. 为什么在原始截断时DataTable副本会被截断?
- 4. 如何在修改原始列表时不更改对象列表的副本?
- 5. 如何更改ArrayList中的元素而不影响原始副本?
- 6. Python修改数组副本影响原始?
- 7. 修改后的原始数组值
- 8. 检索修改引用的原始值
- 9. 副本的修改原产地/开发原产/主
- 10. 当原始文件被修改时更新文本文件的副本
- 11. 初始化和修改ArrayList
- 12. 是否更改变量的副本更改原始?
- 13. 如何复制不受原始ArrayList影响的ArrayList更改?
- 14. 为什么列表副本上的操作不会修改原始列表中的元素?
- 15. 更改列表的副本而不更改Lisp中的原始列表
- 16. 原始数组值被修改
- 17. 在指令中修改原始文本
- 18. ArrayList通过更改其副本更改
- 19. 对象副本和原始副本的实例变量
- 20. 为什么ArrayList副本的行为与整数副本不一样?
- 21. 原始HashMap被修改
- 22. 修改原型有没有不好的副作用?
- 23. 当另一个ArrayList设置等于它时,原始ArrayList被修改
- 24. 如何将范围的深层副本复制到不跟踪原始范围更改的新副本?
- 25. 为什么修改缓冲区片修改原始?
- 26. 如何在不修改原始类的情况下删除instancemethod对象,但不修改原始类
- 27. 当我修改,修改和删除原始指针时,是否需要指针副本?
- 28. 带有修改的XSLT副本
- 29. 将一个ArrayList转换为一个不可修改的ArrayList
- 30. PriorityQueue的副本,而不会干扰原始的PriorityQueue
我试过使用复制构造函数,但是这导致了相同的输出。难道是因为PreviewMonitor(我的对象)包含一个JButton对象,这正是我使用PreviewMonitor.getJButton()拉对象? –
我也尝试过以上的方法,但是当我修改克隆对象时,它也会反映到原来的一个,也不知道出了什么问题。 –