我正在研究一個保存和調用屏幕狀態的系統,這是我第一次搞這樣的東西,所以我不確定最好的東西有關這方面的方法是,但我現在將所有「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()拉對象? –
我也嘗試過以上的方法,但是當我修改克隆對象時,它也會反映到原來的一個,也不知道出了什麼問題。 –