簡體   English   中英

設置拋出IndexOutOfBoundsException的ArrayList的方法

[英]Set Method of ArrayList throwing IndexOutOfBoundsException

在使用ArrayList ,我發現在使用帶有initialCapacity的構造函數設置數組的初始大小之后,使用set()將拋出異常,盡管創建了數組,但是未正確設置大小。

使用ensureCapacity()將無法工作,因為它基於elementData數組而不是size

由於靜態DEFAULT_CAPACITYensureCapacity()還有其他副作用。

使這項工作的唯一方法是在使用構造函數后使用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

test.size()不會拋出異常,而是test.set(5, "test"); 這是因為您在索引5處設置元素,但列表當前為空。

List test = new ArrayList(10);

不會創建使用10個null元素初始化的列表。 它創建一個初始容量為10個元素的列表,即支持數組的大小為10,但列表本身仍為空。

如果要初始化包含10個null元素的列表,可以使用

List<String> list = new ArrayList<>(Collections.nCopies(10, null));

作為旁注, 您不應該使用List這樣的原始類型,但總是更喜歡參數化列表。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM