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
กรณีโอเวอร์โฟลว์นี้ได้รับการจัดการโดยถัดไปหาก เมื่อnewCapacity
มี overflowed นี้จะ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)
ในแง่ของการป้องกันการล้น?