數(shù)組用一塊連續(xù)的內(nèi)存地址來存儲(chǔ)相同類型的一組數(shù)據(jù)袭艺。最大的特點(diǎn)是支持隨機(jī)訪問搀崭,但插入、刪除操作也因此變得比較低效猾编,平均情況時(shí)間復(fù)雜度為 O(n) 瘤睹。在平時(shí)的業(yè)務(wù)開發(fā)中,我們可以直接使用編程語言提供的容器類答倡,但是轰传,如果是特別底層的開發(fā),直接使用數(shù)組可能會(huì)更合適瘪撇。
相比容器获茬,數(shù)組的用武之地
- Java中的
ArrayList
無法存儲(chǔ)基本數(shù)據(jù)類型(Autoboxing和Unboxing會(huì)有性能損耗),所以對性能有要求港庄,需要選用數(shù)組。 - 如果數(shù)據(jù)大小已知锦茁,且操作簡單攘轩,則選用數(shù)組。
動(dòng)態(tài)數(shù)組類Array
底層采用靜態(tài)數(shù)組存儲(chǔ)數(shù)據(jù)码俩,類中維護(hù)兩個(gè)變量data
和size
度帮。
private E[] data; //靜態(tài)數(shù)組存儲(chǔ)數(shù)據(jù)
private int size; //記錄數(shù)組中元素的個(gè)數(shù),即數(shù)組大小
-
resize(int capacity):
調(diào)整容量操作稿存。在插入操作時(shí)笨篷,如果數(shù)組的容量已滿,會(huì)觸發(fā)擴(kuò)容操作瓣履;在刪除操作后率翅,如果元素?cái)?shù)量小于數(shù)組容量的四分之一,則觸發(fā)縮容操作袖迎。這里需要注意由于此操作會(huì)引發(fā)的復(fù)雜度震蕩冕臭,縮容應(yīng)該避免過于激進(jìn)。
public void resize(int newCapacity) { //生成新數(shù)組 E[] newData = (E[])new Object[newCapacity]; //移動(dòng)數(shù)據(jù) for(int i = 0; i < size; i ++) { newData[i] = data[i]; } System.arrayCopy(data,0,newData,0,size); //更新引用 data = newData; }
-
add(int index, E e):
在指定的位置index插入指定的元素e
public void add(int index, E e) { //索引檢查 if(index < 0 || index >= size) { throw new RuntimeException("Index out of bound!"); } if(size == getCapacity()) { //容量不足燕锥,擴(kuò)容 resize(2 * getCapacity()); } //從后面開始辜贵,元素后移 for(int i = size; i > index; i++) { data[i] = data[i-1]; } data[index] = e; size ++; }
-
remove(int index):
刪除指定位置的元素
public E remove(int index) { //索引檢查 if(index < 0 || index >= size) { throw new RuntimeException("Index out of bound!"); } //保存要被刪除的數(shù)值 E ret = data[index]; for(int i = index; i < size; i ++) { data[i] = data[i+1]; } size --; if(size < getCapacity()/4 && getCapacity/2 != 0) { resize(getCapacity()/2); } return ret; }
18/06/2019 :created