中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

動態數組在java中的實現

發布時間:2020-06-21 19:52:19 來源:億速云 閱讀:150 作者:鴿子 欄目:編程語言

聲明:

data為數組名。

size為數組中最后一個元素的下一個位置。

實現動態數組的原因:

因為java中的數組是靜態的,在new數組時就需要指定數組的大小,如果需要存儲的元素為未知的個數,設置空間過大會造成浪費,設置空間過小會無法存入全部數據,我們利用自己寫的resize()方法,便可以實現自動擴容,不再擔心數組容量的問題。

需要自動擴容或自動縮容的時候一般是數組滿了或數組空余空間過多的時候,多發生在添加和刪除操作中。

size == data.length的時候表示數組已滿,調用resize(int newCapacity)方法,參數傳入2*data.length,意為新創建的數組長度為原數組的二倍。

size == data.length /4 并且data.length/2 != 0的時候,調用resize方法進行縮容。

在ArrayList的自動擴容方法中參數默認為1.5*capacity

在resize()方法實現中new了一個新的名為newData的數組用來接收原數組中的元素。利用for循環將數組中的元素進行轉移。

add方法實現

//向指定位置添加元素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方法實現

//刪除元素,并返回被刪除的元素
	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方法實現

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;
	}
	//判斷元素是否存在于數組中
	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);
	}
	//從數組中刪除元素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中動態數組的具體實現的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜君县| 嘉善县| 德阳市| 无极县| 潮州市| 河津市| 麻阳| 铜陵市| 延安市| 鄂尔多斯市| 望谟县| 乐亭县| 枞阳县| 廊坊市| 横峰县| 靖安县| 湘潭市| 云南省| 南宫市| 个旧市| 上蔡县| 兴城市| 太保市| 丹凤县| 邵东县| 葫芦岛市| 阜康市| 永德县| 济阳县| 麦盖提县| 江口县| 富裕县| 富顺县| 望都县| 广东省| 工布江达县| 永春县| 巨野县| 阳高县| 盐亭县| 双牌县|