a < bそしてa - b < 0二つの異なるものを意味することができます。次のコードを検討してください。
int a = Integer.MAX_VALUE;
int b = Integer.MIN_VALUE;
if (a < b) {
System.out.println("a < b");
}
if (a - b < 0) {
System.out.println("a - b < 0");
}
実行すると、のみが印刷されますa - b < 0。何が起こるかa < bは明らかに誤りですが、a - bオーバーフローしてになり-1、これは否定的です。
それでは、配列の長さが本当にに近いことを考慮してくださいInteger.MAX_VALUE。のコードはArrayList次のようになります。
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
oldCapacity本当に近いInteger.MAX_VALUEのでnewCapacity(あるoldCapacity + 0.5 * oldCapacity)オーバーフローとなる可能性がありますInteger.MIN_VALUE(すなわち負)。次に、minCapacity アンダーフローを減算して正の数に戻します。
このチェックにより、ifが実行されないことが保証されます。コードがとして記述されている場合if (newCapacity < minCapacity)、それはtrueこの場合(newCapacity負なので)であるため、newCapacityにminCapacity関係なくが強制されoldCapacityます。
このオーバーフローのケースは、次のifによって処理されます。ときにnewCapacityオーバーフローした、これは次のようになりますtrue:MAX_ARRAY_SIZEとして定義されているInteger.MAX_VALUE - 8とInteger.MIN_VALUE - (Integer.MAX_VALUE - 8) > 0ありますtrue。newCapacity従って正しく処理される:hugeCapacityメソッドの戻りMAX_ARRAY_SIZEまたはInteger.MAX_VALUE。
注意:これは// overflow-conscious code、このメソッドのコメントが言っていることです。
if (newCapacity - minCapacity < 0)優れていif (newCapacity < minCapacity)ますか?