Java AbstractListソースコード分析
AbstractListは抽象コンテナであり,サブクラス実装に便利なabstractメソッドが多い.このクラスは主に反復器機能を実現し,一連のコンテナの操作インタフェースを定義した.反復器は内部クラスで、この内部クラスには3つのフィールドがあります.
最初はカーソルとして理解でき、配列要素の最初の下付き記号を識別します.2番目はカーソルとしても理解できますが、この要素が存在しない場合、この値は-1です.3番目のフィールドは、要素配列が変更されたかどうかを検出するための判断に重要です.配列が反復中に増加または削除された場合、直接チェックでき、迅速な失敗を招きます.最も多く使用されている方法を見てみましょう.次の要素があるかどうかを確認します.
論理が単純で乱暴であると判断し,カーソルが配列長に等しいかどうかを直接判断する.等しい場合は、次の要素はありません.等しくない場合は、配列の最後に反復されていません.
次の要素を取得します.
ここでカーソルを取得し、カーソルに対応する値を直接取得して戻ります.
反復器の最も重要な方法を見てみましょう.同時修正の内容を確認します.
この方法は主に反復器構造が完了した後の配列の容量と反復後の配列の容量が等しいかどうかを調べ,等しくなければ他のスレッドが配列長を修正したことを示し,ここではC o n c u r r e ntModificationException同期修正異常,すなわちよく言われる高速失敗(fast fail)が投げ出される.
Java同時プログラミングの実践では、この設計は、このコンテナが単一スレッド操作のみをサポートしているため、このコンテナにマルチスレッド操作があることを善意に注意しただけだと述べています.もちろん、ここで捉えた容器の長さは正確ではありません.
int cursor = 0;
int lastRet = -1;
int expectedModCount = modCount;
最初はカーソルとして理解でき、配列要素の最初の下付き記号を識別します.2番目はカーソルとしても理解できますが、この要素が存在しない場合、この値は-1です.3番目のフィールドは、要素配列が変更されたかどうかを検出するための判断に重要です.配列が反復中に増加または削除された場合、直接チェックでき、迅速な失敗を招きます.最も多く使用されている方法を見てみましょう.次の要素があるかどうかを確認します.
public boolean hasNext() {
return cursor != size();
}
論理が単純で乱暴であると判断し,カーソルが配列長に等しいかどうかを直接判断する.等しい場合は、次の要素はありません.等しくない場合は、配列の最後に反復されていません.
次の要素を取得します.
public E next() {
checkForComodification();
try {
int i = cursor;
E next = get(i);
lastRet = i;
cursor = i + 1;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
ここでカーソルを取得し、カーソルに対応する値を直接取得して戻ります.
反復器の最も重要な方法を見てみましょう.同時修正の内容を確認します.
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
この方法は主に反復器構造が完了した後の配列の容量と反復後の配列の容量が等しいかどうかを調べ,等しくなければ他のスレッドが配列長を修正したことを示し,ここではC o n c u r r e ntModificationException同期修正異常,すなわちよく言われる高速失敗(fast fail)が投げ出される.
Java同時プログラミングの実践では、この設計は、このコンテナが単一スレッド操作のみをサポートしているため、このコンテナにマルチスレッド操作があることを善意に注意しただけだと述べています.もちろん、ここで捉えた容器の長さは正確ではありません.