聲明:

data為數(shù)組名。
size為數(shù)組中最后一個元素的下一個位置。
實現(xiàn)動態(tài)數(shù)組的原因:
因為java中的數(shù)組是靜態(tài)的,在new數(shù)組時就需要指定數(shù)組的大小,如果需要存儲的元素為未知的個數(shù),設(shè)置空間過大會造成浪費,設(shè)置空間過小會無法存入全部數(shù)據(jù),我們利用自己寫的resize()方法,便可以實現(xiàn)自動擴容,不再擔心數(shù)組容量的問題。
需要自動擴容或自動縮容的時候一般是數(shù)組滿了或數(shù)組空余空間過多的時候,多發(fā)生在添加和刪除操作中。
當size == data.length的時候表示數(shù)組已滿,調(diào)用resize(int newCapacity)方法,參數(shù)傳入2*data.length,意為新創(chuàng)建的數(shù)組長度為原數(shù)組的二倍。
當size == data.length /4 并且data.length/2 != 0的時候,調(diào)用resize方法進行縮容。
在ArrayList的自動擴容方法中參數(shù)默認為1.5*capacity。
在resize()方法實現(xiàn)中new了一個新的名為newData的數(shù)組用來接收原數(shù)組中的元素。利用for循環(huán)將數(shù)組中的元素進行轉(zhuǎn)移。
add方法實現(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方法實現(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方法實現(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;
}
//向第一個位置添加一個元素
public void addFirst(E e){
add(0,e);
}
//向最后一個位置添加一個元素
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測試:
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中動態(tài)數(shù)組的具體實現(xiàn)的詳細內(nèi)容,更多請關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!
本文題目:動態(tài)數(shù)組在java中的實現(xiàn)-創(chuàng)新互聯(lián)
瀏覽路徑:http://chinadenli.net/article32/gscsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、Google、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容