[英]Set Method of ArrayList throwing IndexOutOfBoundsException
在使用ArrayList
,我發現在使用帶有initialCapacity
的構造函數設置數組的初始大小之后,使用set()
將拋出異常,盡管創建了數組,但是未正確設置大小。
使用ensureCapacity()
將無法工作,因為它基於elementData
數組而不是size
。
由於靜態DEFAULT_CAPACITY
和ensureCapacity()
還有其他副作用。
使這項工作的唯一方法是在使用構造函數后使用add()盡可能多的時間。
請檢查以下代碼。
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List test = new ArrayList(10);
test.set(5, "test");
System.out.println(test.size());
}
我不確定為什么java會拋出這個異常。
我期望的行為: test.size()
應該返回10並且set(5,...)應該工作。
ACTUAL:拋出Exception IndexOutOfBoundsException
。
那么導致問題的set方法是什么?
test.set(5, "test");
拋出此異常的語句,因為您的ArrayList
為空(如果您使用該語句, size()
將返回0
),並且如果第i個元素尚未包含值,則無法設置該元素。 您必須向ArrayList
添加至少6個元素才能進行test.set(5, "test");
有效。
new ArrayList(10)
不會創建大小為10的ArrayList
。它會創建一個初始容量為10的空ArrayList
。
List test = new ArrayList(10);
創建空列表,其容量為10個元素。它不包含第6個位置的元素,因此您將無法在此位置設置元素。
List test = new ArrayList(10);
創建具有初始容量( 最初列表容量,初始化內部數組長度為10 )的原始類型( Object
)的空 ArrayList
,不要與大小混淆( 元素列表包含的數量 )。
要理解更多,首先要注意的是, ArrayList
只是對數組的 操作 ,以動態地改變我們無法直接使用數組的數組大小。 最終,它是一個智能陣列。
通過設置初始容量,我們告訴ArrayList
最初創建數組10
大小(默認初始容量為10
)。
這是構造函數正在做的事情,
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];//creates initial array
}
您可以相應地增加或減少它,假設您確定需要包含20
元素的列表,最好在開始時設置初始容量。 如果您確定列表中肯定有的最小元素數,它可以避免調整數組的大小 。
test.set(5, "test");
方法替換此處特定位置的元素,它將使用test
替換索引5
處的元素。 但是我們的列表是空的,它沒有任何元素。
這種方法的文檔說,
IndexOutOfBoundsException
- 如果index
超出范圍(index < 0
||index >= size()
)
請注意,list的大小為0
因此index( 5
)大於size( 0
)。
用指定的元素替換此列表中指定位置的元素。
set
參數
index int:要替換的元素的索引
元素E:要存儲在指定位置的元素
返回E先前在指定位置的元素
拋出
IndexOutOfBoundsException
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.