關于一維數組的擴容:
在java開發中,數組長度一旦确定,不可改變。
那麼數組滿了怎麼辦?數組滿了,需要擴容。
java中對數組的擴容是:
先建立一個大容量的數組,然後将小容量數組中的資料一個一個拷貝到大數組當中。
拷貝的方法:System.arraycopy(參數清單);
參數解讀:
src:待拷貝的源數組
srcPos:待拷貝數組的開始拷貝下标
dest:拷貝到的目标數組
destPos:目标數組的開始接收下标
len:需要拷貝元素的個數
測試代碼:
public class ArrayTest05 {
public static void main(String[] args) {
//靜态執行個體化待拷貝的數組,3個元素
Person[] srcPer = {new Person(1002,"李四"),
new Person(1003,"王五"),
new Person(1004,"趙六")};
//動态執行個體化一個較大的數組,來接受資料
Person[] destPer = new Person[5];
//假設目标數組中已經存儲了一個Person張三
destPer[0] = new Person(1001,"張三");
//拷貝之前,先輸出兩個數組的資訊:每個對象的資料 + 哈希處理的對象記憶體位址
System.out.println(destPer[0].id + "," + destPer[0].name + " 位址:" + destPer[0].hashCode());
for (int i = 0; i < srcPer.length; i++) {
System.out.println(srcPer[i].id + "," + srcPer[i].name + " 位址:" + srcPer[i].hashCode());
}
System.out.println("----------------------------------------------------------------------");
//開始拷貝,将srcPer全部拷貝到destPer當中
System.arraycopy(srcPer, 0, destPer, 1, srcPer.length);
//周遊目标數組,檢測是否拷貝成功
for (int i = 0; i < destPer.length; i++) {
if (destPer[i] != null)
System.out.println(destPer[i].id + "," + destPer[i].name + " 位址:" + destPer[i].hashCode());
}
//拷貝成功,銷毀srcPer數組
srcPer = null;
//建議垃圾回收器啟動,建議歸建議,垃圾少時可能不會啟動
System.gc();
}
}
class Person {
int id;
String name;
//構造方法
public Person() {
}
public Person(int id, String name) {
this.id = id;
this.name = name;
}
}
運作截圖:

數組存儲引用資料類型,擴容時進行拷貝的記憶體圖:
總結:
java中對數組的擴容是:
先建立一個大容量的數組,然後将小容量數組中的資料一個一個拷貝到大數組當中。
拷貝的方法:
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int len);
如果數組存儲的是引用資料類型,System.arraycopy()方法拷貝的是位址,不是對象。
另外附上:數組的擴容效率很低,程式應該盡量減少數組的擴容。