package com.github.qq809203042.coding2017.basic.structures; import java.util.Arrays; /* * 根据api中arraylist的方法描述,实现一个自己的arraylist * 基于数组实现 * */ public class MyArrayList implements MyList { // 定义一个私有数组,初始长度为10 private Object[] elementData = new Object[10]; // 定义变量记录ArrayList的长度 private int size = 0; // 获取指定索引上的元素的值 @Override public Object get(int index) { if (index >= 0 && index < size) { return elementData[index]; } else { throw new IndexOutOfBoundsException("查询的索引不存在"); } } // 向列表尾部添加元素 @Override public boolean add(Object obj) { if (size >= elementData.length) {// 若size大于等于现有数组长度,则将数组扩容后再进行操作 elementData = Arrays.copyOf(elementData, elementData.length * 2); } elementData[size] = obj; size++; return true; // 什么时候会返回false,如何返回false? } // 向列表指定位置添加元素 @Override public boolean add(Object obj,int index) { if (size >= elementData.length) {// 若size大于等于现有数组长度,则将数组扩容后再进行操作 elementData = Arrays.copyOf(elementData, elementData.length * 2); } // 将从index开始的所有元素向后移动一位 moveBackward(elementData,index,size-1,1); // 将元素添加到指定位置 elementData[index] = obj; size++; return true; } // 删除指定位置的元素 @Override public Object remove(int index) { if(size == 0){ throw new IndexOutOfBoundsException("列表为空"); } if(index < 0 || index >= size){ throw new IndexOutOfBoundsException("想要删除的元素索引不存在"); } Object removeElement = elementData[index]; moveForward(elementData,index+1,size-1,1); // 最后一位置为null;!! elementData[size-1] = null; size--; return removeElement; } @Override public int size() { return size; } // 判断列表是否为空 @Override public boolean isEmpty() { return size == 0; } // 将数组从startPos位置到endPos位置的元素向后移动step步长 private void moveBackward(Object[] elementData, int startPos, int endPos, int step) { for(int i = endPos + step; i >= startPos + step; i--){ elementData[i] = elementData[i-step]; } } // 将数组从startPos位置到endPos位置的元素向前移动step步长 private void moveForward(Object[] elementData, int startPos, int endPos, int step) { for(int i = startPos - step; i <= endPos - step; i++){ elementData[i] = elementData[i+step]; } } @Override public String toString() { // return Arrays.toString(elementData); Object[] myArrayList = Arrays.copyOf(elementData, size); return Arrays.toString(myArrayList); } }