普通數組的元素個數是固定的,當數組滿了之后要怎么辦?數組要有多大才合適,有時提前並不知道。所以希望能夠在運行時具有改變數組大小的能力。
動態數組就可以在任何時候改變大小。動態數組是指在聲明時沒有確定數組的大小,使用動態數組的優點是可以根據用戶需求,有效利用存儲空間。
假如有一個班級對象clazz,這有一個方法addStudent,這個方法的參數是Student對象,當我們調用addStudent方法添加學生時,在clazz對象中有一個students數組來存放學生對象,但是當數組滿了后,就要創建一個新的數組,這個數組要比原數組大,並把原數組中的學生對象轉移到新數組中,並把原數組釋放了,這樣就成了動態數組,只要調用addStudent者願意,它就可以一直給clazz添加學生。開發中當數組滿時,創建的新數組大小不會是比原數組多一個元素,這樣會在后續加入學生時,每次都創建新數組,轉移數組元素,釋放原數組,效率太低,往往創建的新數組大小是原數組的1.5倍大小。
實現
import java.util.Arrays;
/**
* copyright(c)2021 zbh.ALL rights Reserved
* <p>
* 描述:
*
* @author zbh
* @version 1.0
* @date 2021/2/23
*/
public class Demo6 {
/**
* 初始數組大小
*/
private static final int INIT = 4;
/**
* 存儲數據數組
*/
int[] arr;
/**
* 當前位置
*/
int index = 0;
/**
* 無參默認的構造方法
*/
public Demo6() {
// 構造方法嵌套調用,直接寫this,不寫方法名
// 此代碼只能是第一行
this(INIT);
}
/**
* 初始化對象
*
* @param capacity 數組初始值
*/
public Demo6(int capacity) {
this.arr = new int[capacity];
}
/**
* 增加一個數字
*
* @param num
*/
public void add(int num) {
if (index >= arr.length) {
// arr.length >> 1 等同於arr.length除以2
int length = arr.length + (arr.length >> 1);
// 轉移數組元素,第一個參數是原數組,第二個參數是新數組的長度,copyOf返回新數組
arr = Arrays.copyOf(arr,length);
}
arr[index++] = num;
}
public static void main(String[] args) {
Demo6 d = new Demo6();
for (int i=0;i<20;i++) {
d.add(i);
}
System.out.println(Arrays.toString(d.arr));
}
}
運行結果:
由結果可得:數組初始只有四個大小,當不斷向里面添加數字,數組的容積也在不斷擴大,結果中最后的三個0(沒有放數據,系統給的默認值)是因為創建的新數組大小不會是比原數組多一個元素,這樣會在后續加入學生時,每次都創建新數組,轉移數組元素,釋放原數組,效率太低,往往創建的新數組大小是原數組的1.5倍大小。