java手写的动态数组JimisunArray
/** * @Author:jimisun * @Description: * @Date:Created in 22:10 2018-07-18 * @Modified By: */ public class JimisunArray<E> { private E[] data; private int size; /** * 构造函数,传入数组的容量capacity构造Array * * @param capacity */ public JimisunArray(int capacity) { data = (E[]) new Object[capacity]; size = 0; } /** * 构造函数,如果没有传入数组容量,默认数组初始值10 */ public JimisunArray() { this(10); size = 0; } /** * 获取数组的元素个数 * * @return */ public int getSize() { return size; } /** * 获取数组的容量 * * @return 数组的容量 */ public int getCapacity() { return data.length; } /** * 返回数组是否为null * * @return */ public Boolean isEmpty() { return size == 0; } /** * 向所有元素后添加一个新的元素 * * @param e */ public void addLast(E e) { add(size, e); } /** * 向数组的头部添加一个新元素e * * @param e */ public void addFirst(E e) { add(0, e); } /** * 向指定索引添加元素 * * @param index * @param e */ public void add(int index, E e) { if (index < 0 || index > size) { throw new IllegalArgumentException("Add 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[index] = e; size++; } /** * 扩充数组长度 * * @param newCapacity */ private void resize(int newCapacity) { E[] newData = (E[]) new Object[newCapacity]; for (int i = 0; i < size; i++) { newData[i] = data[i]; } data = newData; } /** * 从数组中删除index位置的元素,返回删除的元素 * * @param index */ public E remove(int index) { if (index < 0 || index >= size) { throw new IllegalArgumentException("Delete failed,Array is full, require index>0 && index<size"); } E ret = data[index]; for (int i = index + 1; i < size; i++) { data[i - 1] = data[i]; } size--; //将最后一个变量设置为null,而并不是留着,垃圾回收机制无法回收,如果重新添加一个变量就会使原来的引用解除关联,很快就会垃圾回收 data[size] = null; //进行数组的懒减弱,防止算法震荡,增加算法的复杂度 if (size == data.length / 4 && data.length / 2 != 0) { resize(data.length / 2); } return ret; } /** * 删除第一个元素 * * @return */ public E removeFirst() { return remove(0); } /** * 删除最后一个元素 * * @return */ public E removeLast() { return remove(size - 1); } /** * 从数组中删除元素e * * @param e */ public boolean removeElement(E e) { int index = find(e); if (index != -1) { remove(index); return true; } return false; } /** * 删除数组中所有的元素e * @param e */ public void removeAllElement(E e) { while (removeElement(e) == true) { removeElement(e); } } /** * 获取指定索引的值 * * @param index * @return */ public E get(int index) { if (index < 0 || index >= size) { throw new IllegalArgumentException("get failed ,index is illagel."); } return data[index]; } /** * 修改指定位置索引的值 * * @param index * @param e */ public void set(int index, E e) { if (index < 0 || index >= size) { throw new IllegalArgumentException("get failed ,index is illagel."); } data[index] = e; } /** * 查找数组中是否有元素e * * @param e * @return */ public boolean contains(int e) { for (int i = 0; i < size; i++) { if (data[i].equals(e)) { return true; } } return false; } /** * 查找数组中元素e所在的索引,如果不存在则返回-1 * * @param e * @return */ public int find(E e) { for (int i = 0; i < size; i++) { if (data[i].equals(e)) { return i; } } return -1; } @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(); } /** * 主方法测试 * * @param args */ public static void main(String[] args) { JimisunArray<Integer> array = new JimisunArray(10); for (int i = 0; i < 10; i++) { array.addLast(i); } for (int i = 0; i < 5; i++) { array.removeFirst(); } System.out.print(array.toString()); } }
杂家不如专家,精益求精