1.前言
我们将ArrayList视作动态数组,但其底层依然通过Object[]数组实现,我这里没有用到泛型,当做存储整形的动态数组.
我实现了增删查改操作,迭代器,及计算数组的长度等函数.
2.动态数组的代码实现
public class SimulateArrayTest implements Iterable<Integer>{ //数组 private static int[] elementDate; //数组实际存储数据的个数. private static int size = 0; //数组的容量 private static int capacity = 10; public SimulateArrayTest() { elementDate = null; } public void add(int value) { if (size == 0) { elementDate = new int[capacity]; } //存储数组的个数大于等于了数组的容量 //则需要进行扩容操作 if (size > capacity) { Dilatation(); } elementDate[size++] = value; } //数组扩容操作 public static void Dilatation() { int newCapacity = capacity + capacity >> 1; int[] newElementData = new int[newCapacity]; System.arraycopy(elementDate, 0, newElementData, 0, size); capacity = newCapacity; } //查取操作 public Integer get(int index) { if (index <= size - 1){ return elementDate[index]; } throw new RuntimeException(); } //改数据的操作 public void get(int index, int value) { if (index >= 0 && index <= size - 1) { elementDate[index] = value; } throw new RuntimeException(); } //删除操作, 两个重载的remove方法 public int remove(int index) { if (size > 0 && index >= 0 && index <= size - 1) { //删除的元素不是数组的末尾的元素, 我们就要把后面的数组赋值贴过来 if (index < size - 1){ //System.arraycopy(Object src, int srcPos,Object dest, int destPos,int length); //可以用于复制数组, 从src的srcPos位置开始复制到dest的destPos开始的位置上, 复制元素的长度为length; System.arraycopy(elementDate, index + 1 , elementDate, index, size - index - 1); } int temp = elementDate[index]; size--; return temp; } throw new RuntimeException(); } public void remove(Integer value) { for (int i = 0; i < size; i++) { if (elementDate[i] == value) { if (i < size - 1) { System.arraycopy(elementDate, i + 1 , elementDate, i, size - i - 1); } size--; } } } //获取数组的长度 public int length() { return size; } public static int count = 0; //遍历, 迭代器 @Override public Iterator<Integer> iterator() { return new Iterator<Integer>() { @Override public boolean hasNext() { if (count < size) { return true; } count = 0; return false; } @Override public Integer next() { return elementDate[count++]; } }; } public static void Traverse(Consumer<Integer> consumer) { for (int i = 0; i < size; i++) { consumer.accept(elementDate[i]); } } }
我们可以向动态数组中添加元素,并遍历.
@Test public void test() { SimulateArrayTest s = new SimulateArrayTest(); s.add(12); s.add(23); s.add(34); s.add(45); s.add(56); s.add(67); s.Traverse(value -> { System.out.println(value); }); } 控制台 : 12 23 34 45 56 67