package com.dudy.learn01.data_structure.list; import com.dudy.learn01.data_structure.MyIterator; import com.dudy.learn01.data_structure.MyList; import java.util.Arrays; public class MyArrayList implements MyList { private int size = 0; private Object[] elementData = new Object[16]; /** * 增加元素: ①数组没满之前,直接添加到最后,满了扩容添加 */ public void add(Object o) { // 检查是否需要扩容 this.checkGrow(size + 1); elementData[size++] = o; } /** * 检查是否需要扩容 * * @param newSize */ private void checkGrow(int newSize) { if (newSize > elementData.length) { this.grow(elementData); } } /** * 扩容 * * @param oldElementData */ private void grow(Object[] oldElementData) { int lenth = (int) (oldElementData.length * 1.5); elementData = Arrays.copyOf(oldElementData, lenth); } /** * 根据索引添加:①同 add ② 可能会出现 index 超出当前位置的情况 ③往 中间插入时需要移位 */ public void add(int index, Object o) { // 检查是否需要扩容 if (index > size || index < 0) { throw new RuntimeException("Index: " + index + ", Size: " + size); } this.checkGrow(size + 1); // 循环移位 int tmp = size; for (int i = 0; i < size - index; i++) { elementData[tmp] = elementData[tmp - 1]; tmp--; } // 索引位置赋值 elementData[index] = o; size++; } /** * 直接返回相应数组下标就好 */ public Object get(int index) { return elementData[index]; } /** * 删除元素:①注意移位 */ public Object remove(int index) { // 检查是否需要扩容 if (index > size || index < 0) { throw new RuntimeException("Index: " + index + ", Size: " + size); } Object desc = elementData[index]; for (int i = 0; i < size - index; i++) { elementData[index] = elementData[index+1]; index++; } size--; return desc; } public int size() { return this.size; } public MyIterator iterator() { return new MyItr(); } public class MyItr implements MyIterator{ int cursor; public boolean hasNext() { return cursor != size; } public Object next() { return elementData[cursor++]; } } @Override public String toString() { StringBuffer str = new StringBuffer(); str.append("["); for (int i = 0; i < size; i++) { str.append(elementData[i]+","); } str.append("]"); return str.toString(); } }