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.
NB : 이것이이 // overflow-conscious code방법 의 의견입니다.
if (newCapacity - minCapacity < 0)보다 더 나은 방법은if (newCapacity < minCapacity)무엇입니까?