聲明:
創(chuàng)新互聯(lián)專注于珠海網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供珠海營(yíng)銷型網(wǎng)站建設(shè),珠海網(wǎng)站制作、珠海網(wǎng)頁設(shè)計(jì)、珠海網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造珠海網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供珠海網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
data為數(shù)組名。
size為數(shù)組中最后一個(gè)元素的下一個(gè)位置。
實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的原因:
因?yàn)閖ava中的數(shù)組是靜態(tài)的,在new數(shù)組時(shí)就需要指定數(shù)組的大小,如果需要存儲(chǔ)的元素為未知的個(gè)數(shù),設(shè)置空間過大會(huì)造成浪費(fèi),設(shè)置空間過小會(huì)無法存入全部數(shù)據(jù),我們利用自己寫的resize()方法,便可以實(shí)現(xiàn)自動(dòng)擴(kuò)容,不再擔(dān)心數(shù)組容量的問題。
需要自動(dòng)擴(kuò)容或自動(dòng)縮容的時(shí)候一般是數(shù)組滿了或數(shù)組空余空間過多的時(shí)候,多發(fā)生在添加和刪除操作中。
當(dāng)size == data.length
的時(shí)候表示數(shù)組已滿,調(diào)用resize(int newCapacity)
方法,參數(shù)傳入2*data.length
,意為新創(chuàng)建的數(shù)組長(zhǎng)度為原數(shù)組的二倍。
當(dāng)size == data.length /4
并且data.length/2 != 0
的時(shí)候,調(diào)用resize
方法進(jìn)行縮容。
在ArrayList的自動(dòng)擴(kuò)容方法中參數(shù)默認(rèn)為1.5*capacity
。
在resize()方法實(shí)現(xiàn)中new了一個(gè)新的名為newData
的數(shù)組用來接收原數(shù)組中的元素。利用for循環(huán)將數(shù)組中的元素進(jìn)行轉(zhuǎn)移。
add方法實(shí)現(xiàn)
//向指定位置添加元素e public void add(int index,E e){ if(index<0||index>size){ throw new IllegalArgumentException("AddLast failed.Require index error"); } if(size == data.length){ resize(2*data.length); } for (int i = size-1; i >= index; i--) { data[i+1] = data[i]; } data[index] = e; size++; }
remove方法實(shí)現(xiàn)
//刪除元素,并返回被刪除的元素 public E remove(int index){ if(index<0 || index >=size){ throw new IllegalArgumentException("Remove failed. Index is illegal"); } E ret = data[index]; for (int i = index+1; i < size; i++) { data[i-1] = data[i]; } size--; data[size] = null;//loitering objects != memory leak if(size == data.length /4 && data.length/2 != 0){ resize(data.length/2); } return ret; }
resize方法實(shí)現(xiàn)
private void resize(int newCapacity){ E[] newData = (E[])new Object[newCapacity]; for (int i = 0; i < size; i++) { newData[i] = data[i]; } data = newData; }
Array類
package array; public class Array<E> { private E[] data; private int size; @SuppressWarnings("unchecked") public Array(int capacity){ data = (E[]) new Object[capacity]; size = 0; } public Array(){ this(10); } public int getSize(){ return size; } public int getCapacity(){ return data.length; } public boolean isEmpty(){ return size == 0; } //向第一個(gè)位置添加一個(gè)元素 public void addFirst(E e){ add(0,e); } //向最后一個(gè)位置添加一個(gè)元素 public void addLast(E e){ add(size,e); } //向指定位置添加元素e public void add(int index,E e){ if(index<0||index>size){ throw new IllegalArgumentException("AddLast failed.Require index error"); } if(size == data.length){ resize(2*data.length); } for (int i = size-1; i >= index; i--) { data[i+1] = data[i]; } data[index] = e; size++; } //獲取index位置的元素e public E get(int index){ if(index<0 || index >=size){ throw new IllegalArgumentException("Get failed. Index is illegal"); } return data[index]; } //修改index索引位置的元素e public void set(int index, E e){ if(index<0 || index >=size){ throw new IllegalArgumentException("Get failed. Index is illegal"); } data[index] = e; } //判斷元素是否存在于數(shù)組中 public boolean contains(E e){ for (int i = 0; i < size; i++) { if(data[i].equals(e)){ return true; } } return false; } //找到元素并返回索引 public int find(E e){ for (int i = 0; i < size; i++) { if(data[i].equals(e)){ return i; } } return -1; } //刪除元素,并返回被刪除的元素 public E remove(int index){ if(index<0 || index >=size){ throw new IllegalArgumentException("Remove failed. Index is illegal"); } E ret = data[index]; for (int i = index+1; i < size; i++) { data[i-1] = data[i]; } size--; data[size] = null;//loitering objects != memory leak if(size == data.length /4 && data.length/2 != 0){ resize(data.length/2); } return ret; } public E removeFirst(){ return remove(0); } public E removeLast(){ return remove(size-1); } //從數(shù)組中刪除元素e public void removeElement(E e){ int index = find(e); if(index != -1){ remove(index); } } @Override public String toString(){ StringBuilder res = new StringBuilder(); res.append(String.format("Array:size = %d ,capacity = %d\n",size,data.length)); res.append('['); for (int i = 0; i < size; i++) { res.append(data[i]); if(i != size-1){ res.append(","); } } res.append(']'); return res.toString(); } private void resize(int newCapacity){ E[] newData = (E[])new Object[newCapacity]; for (int i = 0; i < size; i++) { newData[i] = data[i]; } data = newData; } }
Main測(cè)試:
package array; public class Main { public static void main(String[] args){ Array<Integer> arr = new Array<>(); for (int i = 0; i < 10; i++) { arr.addLast(i); } System.out.println(arr); arr.add(1, 100); System.out.println(arr); arr.addFirst(-1); System.out.println(arr); arr.set(0, 1); System.out.println(arr); } }
以上就是java中動(dòng)態(tài)數(shù)組的具體實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!
本文標(biāo)題:動(dòng)態(tài)數(shù)組在java中的實(shí)現(xiàn)
文章起源:http://aaarwkj.com/article6/ijppog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、、外貿(mào)建站、網(wǎng)站營(yíng)銷、全網(wǎng)營(yíng)銷推廣、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)