2012-07-02 44 views
-1

假設我有一個名爲「Node」的對象列表 - > Iterable allNodes。Java內部有關列表的參考和副本

比方說,我通過allnodes中所有節點迭代,並將它們添加到自己的名單,像這樣:

Iterable<Node> allNodes = dataManager.getAllNodes(); 
List<Node> copyOfAllNodes; 
for(Node node : allNodes) { 
    copyOfAllNodes.add(node); 
} 

是否拷貝成爲一個參考或者是它不影響原始列表的副本?

+5

假設你不知道(你應該!),這難以測試嗎? – alfasin

+0

Touche先生,你是對的,我絕對應該自己測試一下,看看它是不是。 –

回答

3

它將成爲一個參考。當您執行:

copyAllNodes.add(node) 

您是inserint node是一個對象爲copyAllNodes

如果你想要一個對象的副本,你有其他的方法。的方法之一可能是close,即基本實現Cloneable接口,並以複製的對象暴露clone方法,所以你可以這樣做:

copyAllNodes.add(node.clone) 

,這將是你可以修改副本在複製的對象上沒有任何反射。 請記住,默認克隆方法只是對象的淺表副本。

documentation

Object類的方法克隆執行特定克隆 操作。首先,如果此對象的類未實現接口Cloneable,則引發CloneNotSupportedException。注意 所有數組都被視爲實現接口Cloneable。 否則,此方法創建此 對象的類的新實例,並使用該對象的相應字段的 的內容來初始化其所有字段,就像通過賦值一樣;該字段的內容 本身並不克隆。因此,此方法執行此對象的「淺拷貝」的 ,而不是「深拷貝」操作。

+0

感謝您明確表達,我通常使用C++編寫代碼,所以我對發生的事情感到困惑。 –