在Java中,ArrayList和LinkedList等集合類使用了動態(tài)擴容策略來存儲和管理元素。這里以ArrayList為例,介紹其內部實現原理以及如何實現動態(tài)擴容。
ArrayList內部實現原理: ArrayList是一個動態(tài)數組,其底層使用一個Object類型的數組elementData來存儲元素。當向ArrayList中添加元素時,如果elementData的長度小于等于需要添加的元素個數,那么ArrayList會進行動態(tài)擴容。
動態(tài)擴容的實現: ArrayList的動態(tài)擴容主要包括以下幾個步驟:
a. 計算新的容量:首先,計算新的容量大小。通常情況下,新的容量大小為原容量的1.5倍。這是因為擴容操作需要消耗一定的資源,為了減少擴容操作的次數,通常會預留一定的空間。
b. 檢查新容量是否合法:如果新的容量大小為Integer.MAX_VALUE,那么將新的容量設置為Integer.MAX_VALUE。這是因為在Java中,數組的最大長度為Integer.MAX_VALUE,所以需要檢查新容量是否超過了這個值。
c. 創(chuàng)建新的數組:根據新的容量大小,創(chuàng)建一個新的數組。新的數組的長度為新容量大小。
d. 復制元素:將原數組中的元素復制到新數組中。注意,這里是從原數組的最后一個元素開始復制,直到新數組的第一個元素。
e. 更新數組引用:將原數組的引用更新為新數組。
示例代碼:
import java.util.ArrayList;
public class DynamicArrayDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add("Element " + i);
if (list.size() == list.capacity()) {
System.out.println("Dynamic resizing occurred.");
list = new ArrayList<>(list.capacity() * 2);
}
}
System.out.println(list);
}
}
在這個示例中,我們創(chuàng)建了一個ArrayList,并向其中添加了10個元素。當ArrayList的容量不足以存儲新添加的元素時,會自動進行動態(tài)擴容。