package com.dapeng.Array; import com.sun.org.apache.xpath.internal.functions.FuncFalse; import javax.xml.ws.soap.Addressing; import java.util.Date; public class Array<E> { //爲了容納不一樣數據類型 包括自定義類 咱們定義了泛型 private E [] data; private int size; //當前數組存放的數據數量 //構造函數 傳入數組的容量capacity 構造Array public Array(int capacity){ /* 由於泛型不是Java一開始就支持的好像是1.5之後 會有歷史遺留問題, 因此不能直接new 這個泛型。 須要經過new Object 而後強制轉換。 Java中任意類都是Object的子類 */ 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 addLast(E e) {add(size,e); } public void addFirst(E e) { add(0,e); } //在index的索引位置插入一個新元素。 public void add(int index,E e) { if(index <0 || index > size) throw new IllegalArgumentException("AddList failed. require index >=0 and index <=size. "); if(size == data.length) resize(2 * data.length); for (int i= size-1;i>=index ;i--) { data[i+1] = data[i];// data[i+1] =data[i+] 每一個元素都向後挪一位 } data[index] = e; size++; } private void resize(int newCapacity) { E[] newData = (E[]) new Object[newCapacity]; for(int i = 0; i < size; i++ ) { newData[i] = data[i]; } data = newData ; } public E get(int index) { if (index<0 || index >= size) throw new IllegalArgumentException("Get failed. Index is illegal."); return data[index]; } public E getLast(){ return get(size-1); } E getFirst(){ return get(0); } void set(int index,E e) { if (index<0 || index >= size) throw new IllegalArgumentException("Set 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; } //查找數組元素中e索引位置,若是不存在返回-1 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--; //由於是應用類型 包裝類 因此在對象空間佔用內存,須要賦空值等待回收。 既是往前挪了一位原理是把後一位往前挪 // 可是最後一位仍然是存在的而且是重複的。例如 1 2 3 1 3 3 data[size] = null; if(size == data.length / 4 && data.length / 2 != 0) //爲了防止 removeLast 和addLast產生的複雜度震盪 使用了一個懶方法就是不當即縮容 resize(data.length / 2); return ret; } //從數組中刪除第一個元素 返回刪除的元素 public E removeFirst(){ return remove(0); } public E removeLast(){ return remove(size-1); } public void removeElement(E e){ int index = find(e); if(index!=-1){ this.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(); } }
動態數組解讀視頻地址:https://www.ixigua.com/i6815189948249932295/java