2014-05-23 139 views
1

從概念上講,這裏發生了什麼?將ArrayList添加到ArrayList

我有一個ArrayList

ArrayList<SomeClass> myArray = new ArrayList<SomeClass>(); 

然後我添加的東西給它這樣的

myArray.add(new myArray(1, 2, 3)); 
+0

可能重複[?如何連接在Java中的兩個陣列(http://stackoverflow.com/questions/80476/how-to-concatenate-two-arrays-in -java) –

+0

'myArray'是'ArrayList' – Reimeus

+0

@JoelWitteveen,這是不正確的。問題是關於數組列表包含數組的方式 –

回答

2

我有一個數組

ArrayList myArray = new ArrayList(); 

不,你不」有一個數組。陣列使用brackes []聲明,就像這樣:

int[] myArray; 

你有ArrayList類的對象。該對象將在內部使用數組來存儲數據,並在需要分配更多值時動態更改新數組的數組。

然後我添加的東西給它這樣的

myArray.add(new myArray(1, 2, 3)); 

概念上,這是錯誤的,甚至不會編譯。如果您想要在數組中添加多個值,則應使用ArrayList#addAll方法,該方法會接收另一個集合。然後,你有兩種方式來傳遞一個Collection在一個聲明:

  1. 使用Arrays#asList創建一個列表:

    myArray.addAll(Arrays.asList(1, 2, 3)); 
    
  2. 您可以使用雙大括號初始化:

    myArray.addAll(new ArrayList() {{ 
         add(1); 
         add(2); 
         add(3); 
        }}); 
    

你應該考慮到,你應該指定,而不是使用原始數據一般爲您ArrayList

ArrayList<Integer> myArray = new ArrayList<Integer>(); 
myArray.addAll(new ArrayList<Integer>() {{ 
     add(1); 
     add(2); 
     add(3); 
    }}); 

更多信息:


請注意,如果你有一個ArrayList被綁定到自定義類,比方說ArrayList<SomeClass> myArrayList,那麼編譯器會阻止您添加元素,以不通過IS-A測試(由instanceof操作說明)列表,所以這段代碼:

ArrayList<SomeClass> myArrayList = new ArrayList<SomeClass>(); 
myArrayList..addAll(new ArrayList<Integer>() {{ 
     add(1); 
     add(2); 
     add(3); 
    }}); 

由於Integer不是SomeClass,因此將無法編譯。類似與這段代碼:

ArrayList<SomeClass> myArrayList = new ArrayList<SomeClass>(); 
myArray.add(Arrays.asList(1, 2, 3)); 

但由於type erasure您可以通過使用原始類型的欺騙編譯器。例如:

public void addData(ArrayList yourArrayList, Object anyData) { 
    yourArrayList.add(anyData); 
} 

然後在你的代碼,調用此方法:

ArrayList<String> myArrayList = new ArrayList<String>(); //allows Strings only 
myArrayList.add("Hello world"); 
//myArrayList.add(0); //this won't compile because trying to add an Integer 
addData(myArrayList, 0); //this will compile for using raw ArrayList and sending an Integer 
System.out.println(myArrayList); 

它會打印:

[Hello world, 0] 
+2

「**概念上這裏發生了什麼?**」 –

+0

如果你知道添加的數組列表的大小,那將會很好ArrayList的大小:'new ArrayList(size)' – herau

+0

@LuiggiMendoza他似乎在問什麼是數組列表/它是如何工作的。沒有其他的。 –

0
myArray.add(new myArray(1, 2, 3)); 

這是不正確的,不編譯,因爲myArray不是一種類型,它只是一個參考,您需要某種類型的整數,或者如果您想添加另一個列表,則使用addAll

你可以使用這樣的東西。

List<Integer> myArray = new ArrayList<>(); // specify with generics type parameter 
//do some things and then 
myArray.addAll(Arrays.asList(1,2,3)); // use this helper method to add a list to another list 

或者,如果你只想創建和填充,只需要使用

List<Integer> myArray = Arrays.asList(1,2,3,4,5); 
+0

用戶問:「**概念上是怎麼回事?**」 –

+0

@JordanD編輯 – nachokk

0

我想我知道你想要做什麼,說你有這個。

ArrayList<Integer[]> myArray = new ArrayList<Integer[]>(); 

和你想的陣列添加到它,你基本上要打電話

myArray.add(((Integer[]) new int[] { 0, 1, 2 })); 

將在ArrayList中的數組[0,1,2]添加到下一個索引。

對於〔實施例,下面的代碼

ArrayList<Integer[]> myArray = new ArrayList<Integer[]>(); 
myArray.add(((Integer[]) new int[] { 0, 1, 2 })); 
myArray.add(((Integer[]) new int[] { 1, 0, 2 })); 
myArray.add(((Integer[]) new int[] { 3, 2, 1 })); 

會造成以下結果:

myArray index 0 = [0, 1, 2] 
myArray index 1 = [1, 0, 2] 
myArray index 2 = [3, 2, 1] 

這是你的問題?

0

實際上你並沒有一個數組,你有一個ArrayList。 ArrayList是List接口的可調整大小的實現。這意味着,除其他外,您不必像定義數組那樣定義長度。

我不認爲你已經提供了將實際編譯,因爲當你去代碼:

myArray.add(new myArray(1, 2, 3)); 

你沒有提供一個類型。你應該去類似:

myArray.add(new ArrayList<Integer>(Arrays.asList(1,2,3))); 

使用asList()幾乎給數組分配「默認」值相當於。該陣列相當於將是這個樣子:

Integer[] intArray = new Integer[] {1,2,3}; 

你也應該參數的ArrayList(S),這基本上意味着你在說什麼的ArrayList可以容納。例如:

ArrayList<Integer> 

可以保持整數。

原因你必須使用一個包裝類(Integer &不int)是因爲在Java集合不允許您存儲原始類型,例如intdouble

您可以擁有一個集合,持有另一個集合。在這種情況下,你可以去:

ArrayList<ArrayList<Integer>> myArrayList = new ArrayList<ArrayList<Integer>>(); 
    myArrayList.add(new ArrayList<Integer>(Arrays.asList(1, 2, 3))); 
    myArrayList.add(new ArrayList<Integer>(Arrays.asList(9, 12, 24))); 
    for (ArrayList<Integer> index : myArrayList) { 
     System.out.println(index); 
    } 

在這裏你有一個ArrayList控制其他兩個ArrayList。這導致的打印:

[1, 2, 3] 
[9, 12, 24]