天天看點

Java中一維數組的擴容與拷貝

關于一維數組的擴容:

在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中一維數組的擴容與拷貝

數組存儲引用資料類型,擴容時進行拷貝的記憶體圖:

Java中一維數組的擴容與拷貝

總結:

java中對數組的擴容是:

先建立一個大容量的數組,然後将小容量數組中的資料一個一個拷貝到大數組當中。

拷貝的方法:

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int len);

如果數組存儲的是引用資料類型,System.arraycopy()方法拷貝的是位址,不是對象。

另外附上:數組的擴容效率很低,程式應該盡量減少數組的擴容。