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)
무엇입니까?