ArrayList#get
,set
和remove
首先調用rangeCheck
方法。此方法不檢查索引是否爲負數。它只檢查索引是否大於或等於數組的長度。 Javadoc解釋了原因;如果索引是負數,則數組訪問會拋出ArrayIndexOutOfBoundsException
。爲什麼ArrayList#rangeCheck不檢查索引是否爲負數?
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
根據Java Langauage Specification,如果索引是不僅負而且GTE數組訪問拋出一個ArrayIndexOutOfBoundsException。
在運行時檢查所有數組訪問;嘗試使用小於零或大於或等於 數組長度的索引 會導致拋出ArrayIndexOutOfBoundsException。
我認爲rangeCheck應該同時檢查negative和gte,或者對於性能,應該不檢查。 爲什麼範圍檢查不檢查索引是否爲負值?
因爲它不必。後續的數組訪問已經做到了。正如你的報價所述。 – EJP