2010-08-26 38 views
1

如果我創建一個大小爲5的新的ArrayList ...添加到一個空的ArrayList的中間?

Player P; 
    ArrayList<Player> orderedPlayers = new ArrayList<Player>(5); 

,然後我嘗試添加到ArrayList的中間...

orderedPlayers.add(2, P); 

我得到一個indexoutofbounds ...我也得到indexoutofbounds如果我使用的設置,而不是添加...

orderedPlayers.set(2, P); 

其實我可以添加P到ArrayList中的唯一方法是,如果我使用的0指數...

orderedPlayers.add(0, P); 

也出於一些奇怪的原因,當我這樣做時,我的調試器在eclipse中看到該元素添加到orderedPlayers的第4個索引而不是第0個...是ArrayList越野車還是我完全失去了一些東西?我將如何添加到空ArrayList的中間?

+0

可能的重複http://stackoverflow.com/questions/8896758/initial-size-for-the-arraylist – Raedwald 2016-02-08 15:29:40

+0

可能重複的[ArrayList初始容量和IndexOutOfBoundsException](http://stackoverflow.com/questions/11908037/arraylist-initial-capacity-and-indexoutofboundsexception) – Raedwald 2016-02-08 15:31:09

回答

4

5是初始容量,而不是實際大小。您不能添加到空數組列表的中間。

+0

好吧,現在感謝這麼多 – matt 2010-08-26 18:04:20

+0

@matt沒問題。 – 2010-08-26 18:31:23

1

當您使用參數中的數字創建ArrayList時,此編號將用於設置初始容量。這樣,List不需要爲add()的「每個」調用創建一個新的數組。如果您可以確定您的列表將包含100個元素,則可以使用new ArrayList(100)。這並不意味着100個元素存在或可以訪問。

每個ArrayList實例都有一個容量。容量是用於存儲列表中元素的數組大小。它總是至少與列表大小一樣大。隨着元素被添加到ArrayList,其容量會自動增長。增長政策的細節並未超出添加元素具有不變攤銷時間成本的事實。

在使用ensureCapacity操作添加大量元素之前,應用程序可以增加ArrayList實例的容量。這可能會減少增量重新分配的數量。

0

ArrayLists是動態結構...如果你想能夠添加東西在特定的位置,你可能不得不使用數組。

0

您可以通過循環中的NULL對象初始化您的數組列表。

或即使大小是固定的。然後使用Array而不是List。

0

你似乎錯誤地認爲當你寫new ArrayList<Player>(5)時,你會得到類似於5元素陣列的東西。你不是。您將獲得空的列表,該列表恰好由最初可容納5個元素的內部數組支持。然而,名單本身並沒有任何要素。

當元素添加到元素並從元素中移除元素時,元素是動態的,並且會隨着元素的增長和縮小而變化。你從0個元素開始。如果您再添加5名玩家,則列表將包含5個元素。如果您只是使用沒有索引的普通add(T)方法,則最終將按照它們添加的順序排列元素。

0

通過構建一個初始容量爲ArrayList(int initialCapacity)的ArrayList,您可以大致指示列表可以在Java增加其大小之前獲得多大的列表。

您不像在數組中那樣分配插槽。 ArrayList的大小基於列表中元素的數量,並且不能將值插入或設置爲大於其大小的索引。

2

這裏可能是你想要什麼,以初始化orderedPlayers做:

ArrayList<Player> orderedPlayers = 
    new ArrayList<Player>(Collections.nCopies(5, null)); 

然後你有5個null元素的列表,在這一點上,你可以在它的中間插入。

+0

這看起來像是在試圖強化一個列表,去做一些沒有做的事情。如果你確實需要一個數組,你應該使用一個數組。我覺得''List'有一種更習慣性的用法,可以用於任何提問者試圖做的事情。 – ColinD 2010-08-26 20:00:38