测试代码:
public static void main(String[] args) { ArrayPlus<Integer> arr = new ArrayPlus<>(); for (int i = 12; i < 16; i++) arr.addLast(i); System.out.println(arr); arr.add(1,100); System.out.println(arr); }
返回结果:
Array:Size = 4,capacity = 10 [12,13,14,15] Array:Size = 5,capacity = 10 [12,100,13,14,15]
2.2 数组删除元素
实现代码:
//查找数组中元素e所在的索引,如果不存在元素e,则返回-1 public int find(E e){ for (int i = 0; i < size; i++) { if(data[i].equals(e)) return i; } return -1; } //从数组中删除index位置的元素,返回删除的元素 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--; // loitering objects != memory leak data[size] = null;//如果一旦使用新的元素,添加新的对象就会覆盖掉 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); }
测试:
import com.bj.array.ArrayPlus; public class Main2 { public static void main(String[] args) { ArrayPlus<Integer> arr = new ArrayPlus<>(); for (int i = 12; i < 16; i++) arr.addLast(i); System.out.println(arr); arr.add(1,100); System.out.println(arr); arr.remove(1); System.out.println(arr); } }
返回示例:
Array:Size = 4,capacity = 10 [12,13,14,15] Array:Size = 5,capacity = 10 [12,100,13,14,15] Array:Size = 4,capacity = 10 [12,13,14,15]
我们看到结果已经把索引为1的删除了,到这里我们已经完成了一大半了,还有一小点也是最重要的,就是当我们添加数据超过了我们的初始容量大小的时候,就会报错,初始容量,无法添加超过的数据,那么我们应该怎么操作呢?其实很简单,我们只需要给我们数组类,添加一个扩容的方法即可,当我们元素的个数等于数组长度的时候,我们就进行扩容,我们称之为 动态数组。
2.3 动态数组
实现代码:
//在第Index个位置插入一个新元素e public void add(int index,E e){ if(index < 0 || index > size) throw new IllegalArgumentException("Add failed . Require index < 0 || 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++; } private void resize(int newCapacity) { E[] newData = (E[])new Object[newCapacity]; for (int i = 0; i < size; i++) newData[i] = data[i]; data = newData; }
动态数组测试:
import com.bj.array.ArrayPlus; public class Main2 { public static void main(String[] args) { ArrayPlus<Integer> arr = new ArrayPlus<>(); for (int i = 0; i < 10; i++) arr.addLast(i); System.out.println(arr); arr.add(1,100); System.out.println(arr); for (int i = 0; i < 6; i++) arr.remove(i); arr.removeLast(); System.out.println(arr); } }
Array:Size = 10,capacity = 10 [0,1,2,3,4,5,6,7,8,9] Array:Size = 11,capacity = 20 [0,100,1,2,3,4,5,6,7,8,9] Array:Size = 4,capacity = 10 [100,2,4,6]
从结果中我们可以看到,当我们数组元素超过初始容量大小时,自动扩容到初始容量的 两倍 也就是20,当我们数组长度小于1/4的时候,为什么是1/4的时候而不是1/2的时候呢,下面我们会做详细介绍。当我们数组长度小于1/4的时候,会自动缩回到初始10的容量,不会去占据大量的内存空间。