2013-04-27 121 views
0

我有很多功能,採取一個全局ArrayList作爲參數,其中一些不作任何改變這個列表,其他人需要刪除這個數組的一些元素,同時工作,所以我在這些函數中創建一個本地tempArrays。分配一個ArrayList值到另一個

static ArrayList array1 = new ArrayList(); 

public fn1(ArrayList array1) 
{ 
    ArrayList tempArray1 = new ArrayList(); 
    tempArray1 = array1; 
    tempArray1.remove(elemnt); 
} 

問題是刪除的元素從原來的ArrayList array1也刪除了,我不知道爲什麼? 。

謝謝..

+1

這是因爲數組列表是引用類型,而您的新數組列表引用了外部列表。對新內容的任何更改都會反映到外部內容上。 – 2013-04-27 19:38:46

回答

6

在行:

tempArray1 = array1; 

正在製作的tempArray1變量引用的ArrayList同一對象,該array1是引用。因此兩者都引用ArrayList的同一個對象。使用任何變量對ArrayList對象所做的任何更改都會反映在這兩個變量中。所以,當你刪除一個元素使用:

tempArray1.remove(elemnt); 

array1也反映,刪除元素。

你應該使用:

ArrayList tempArray1 = new ArrayList(array1); 

官方文件中規定:ArrayList(Collection<? extends E> c)

構造一個包含指定集合 順序它們被收集的返回的元素列表迭代器。

參數: Ç - 其元素放入此列表

2

嘗試做以下

List tempList = new ArrayList(oldArrayList); 
4

的問題是,宣稱tempArray1 = array1;只是使tempArray1array1參考集合。 要創建一個真正的副本,稱之爲:

ArrayList tempArray1 = new ArrayList(array1); 
1

您正在更換您與全球一個創建的實例。試試這個:

ArrayList tempArray1 = new ArrayList(array1); 
tempArray1.remove(elemnt); 
2

爲什麼項目從原來的ArrayList刪除是因爲,在Java中的引用類型(數組,字符串和其他任何這是Object子類)的變量舉行的原因參考文獻,不是值。實際上這意味着ArrayList類型的變量保存分配ArrayList數據的內存地址。當你做tempArray1 = array1;,你只是給tempArray1地址相同ArrayList。這一切只適用於從Java中的Object派生的類型,如果您不知道的話,其確實包括String原始類型(byteshortintlongcharfloatdouble)存儲爲數值。

現在,到你真正的問題;我必須問,爲什麼不僅僅使用get(index)方法來處理該項目?

如果需要真正刪除元素,使用拷貝構造函數ArrayList,就像這樣: ArrayList tempArray1 = new ArrayList(array1);

1

您還可以使用則addAll(Collection c)將方法

static ArrayList array1 = new ArrayList(); 

public fn1(ArrayList array1) 
{ 
    ArrayList tempArray1 = new ArrayList(); 
    tempArray1.addAll(array1); 
    tempArray1.remove(elemnt); 
} 
1

A)tempArray1是一個變量,指的是相同的實例爲array1。爲了使副本,使用拷貝構造函數:

List tempArray1 = new ArrayList(tempArray1); 

B)從方法刪除參數。沒有必要將列表傳入 - 方法中的代碼已經可以訪問列表。事實上,通過使用同名參數傳遞它,你是shadowing原始列表 - 如果傳遞了一個不同的列表,您將使用該列表而不是您認爲正在使用的列表。

C)你應該您的列表,例如:

static ArrayList<String> array1 = new ArrayList<String>(); 

d)始終使用抽象類:更改至列表:

static List<String> array1 = new ArrayList<String>(); 

E)的名單是不是一個數組,所以不要調用變量「array1」 - 它的誤導性:

static List<String> list1 = new ArrayList<String>(); 
2

我覺得ERE是Java的一些素質特徵分析已誤解:

  1. 在聲明Java變量,它是一個對象的一個​​refenrence,像在C/C++的指針。它可以是以前創建的對象的參考,也可以創建一個新的對象來參考。

    //Created a new object instance on heap 
    ArrayList tempArray1 = new ArrayList(); 
    //Both tempArray1 and tempArray2 will point to same object in memory 
    ArrayList tempArray2 = tempArray1; 
    

    在你的代碼首先創建一個新的ArrayList對象全球化志願服務青年tempArray1併爲它ArrayList tempArray1 = new ArrayList();和比tempArray1 = array1;分配的其他全球化志願服務青年來此全球化志願服務青年創建一個新的對象。所以你創建的第一個對象沒有任何引用,它將被刪除。現在tempArray1和tempArray2都指向同一個對象。

  2. 在Java中如果你想複製一個對象,你可以使用它的clone方法,如果它已經實現了Clonable接口。也請看這個問題,以獲得關於克隆的詳細答案How do I copy an object in Java? 所以你想製作一個數組的副本,但是你做錯了。

相關問題