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จะถูกบังคับให้โดยไม่คำนึงถึงminCapacityoldCapacity
กรณีโอเวอร์โฟลว์นี้ได้รับการจัดการโดยถัดไปหาก เมื่อnewCapacityมี overflowed นี้จะtrue: MAX_ARRAY_SIZEถูกกำหนดให้เป็นInteger.MAX_VALUE - 8และเป็นInteger.MIN_VALUE - (Integer.MAX_VALUE - 8) > 0 จึงถูกต้องจัดการ: วิธีการส่งกลับหรือtruenewCapacityhugeCapacityMAX_ARRAY_SIZEInteger.MAX_VALUE
หมายเหตุ: นี่คือสิ่งที่// overflow-conscious codeความคิดเห็นในวิธีนี้พูด
if (newCapacity - minCapacity < 0)ดีกว่าif (newCapacity < minCapacity)ในแง่ของการป้องกันการล้น?