这段代码是java1.8种util.ArrayList中关于数组扩容的一段代码, 上面有一行//overflow-conscious code. 说明下面的代码是对溢出进行考虑的代码 ,但是我花了好多时间在上面仍没有想清楚他是如何避免溢出的, 以及如何在newCapacity溢出的情况下工作的, 望指点迷津
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
Apabila tatasusunan hampir melimpah, tambahkan 1/2 daripada tatasusunan, dan kemudian bandingkan dengan pemalar terbesar tatasusunan Jika ia melebihi saiz maksimum tatasusunan, gunakan tatasusunan baharu
Integer.MAX_VALUE
, dan kemudian tambah yang lama Salin tatasusunan.Perkara yang paling sukar untuk difahami ialah
>>1
, yang sebenarnya bersamaan dengan pembahagian dengan 2.Tulis contoh mudah dan anda akan tahu selepas menyahpepijatnya
Jikaint newCapacity = oldCapacity + (oldCapacity >> 1);
melebihi nilai maksimum int selepas melaksanakan ayat ini, makanewCapacity
akan menjadi nombor negatif Ini memerlukan pemahaman prinsip penambahan dan penolakan perduaan digital.Empat ayat berikut adalah untuk pengendalian apabila
newCapacity
limpahan menjadi nombor negatifSaya rasa anda bercakap tentang mengendalikan senarai tatasusunan yang sama dalam berbilang utas Pada masa ini, masalah limpahan panjang berlaku. serentak. CopyOnWriteArrayList