-1

アクセスしようとしている配列要素が範囲外であるかどうかを効率的にチェックするために Java が使用するメカニズムは何ですか。それができると私が考えた1つの方法は、メモリ内の配列の前にメタデータを持つことです。しかし、各チェックでの if ステートメントは、時間の点で非常に非効率的です。では、実際にはどのように行うのでしょうか。

4

3 に答える 3

2

これは、Oracle 対 Google の戦いで非常に有名なコードです。

private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) {
    if (fromIndex > toIndex)

        throw new IllegalArgumentException("fromIndex(" + fromIndex +
                   ") > toIndex(" + toIndex+")");

    if (fromIndex < 0)
        throw new ArrayIndexOutOfBoundsException(fromIndex);

    if (toIndex > arrayLen)
        throw new ArrayIndexOutOfBoundsException(toIndex);

}

このメソッドは内部的に呼び出されます。

于 2012-12-17T08:15:37.910 に答える
0

以下のような簡単なチェック、

 int[] a = new int[2];

if (a.size >= index )
 System.out.println("Item " + a[i]);
于 2012-12-17T08:16:27.797 に答える
0

*aloadJVM 7仕様で説明されているように、各*astore命令などの境界を文字通りチェックしているようです。

index が arrayref によって参照される配列の境界内にない場合、(*astore、*aload など) 命令は ArrayIndexOutOfBoundsException をスローします。

しかし、それが実際にどのように行われるかは実装固有です。

于 2012-12-17T08:25:06.787 に答える