package com.basic.datastructure; public class ArrayList implements List { private Object[] elementData; private int size; private int enableCapacity; public ArrayList() { this.enableCapacity = 10; this.elementData = new Object[enableCapacity]; } @Override public void add(Object o) { growIfNeeded(); elementData[size] = o; this.size++; } @Override public void add(int index, Object o) { rangeCheckForAdd(index); growIfNeeded(); Object[] tmpObjects = new Object[elementData.length]; System.arraycopy(elementData, 0, tmpObjects, 0, index); tmpObjects[index] = o; System.arraycopy(elementData, index, tmpObjects, index + 1, elementData.length - index - 1); elementData = tmpObjects; this.size++; } @Override public Object get(int index) { if (index > size) { throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } return elementData[index]; } @Override public Object remove(int index) { Object removedObj = this.get(index); rangeCheck(index); Object[] tmpObjects = new Object[elementData.length]; System.arraycopy(elementData, 0, tmpObjects, 0, index); System.arraycopy(elementData, index + 1, tmpObjects, index, elementData.length - index - 1); elementData = tmpObjects; return removedObj; } @Override public int size() { return size; } @Override public String toString() { for (int i = 0; i < elementData.length; i++) { System.out.print(elementData[i] + ","); } return ""; } private void rangeCheck(int paramInt) { if ((paramInt < 0) || (paramInt >= size)) { throw new IndexOutOfBoundsException(outOfBoundsMsg(paramInt)); } } private void rangeCheckForAdd(int paramInt) { if ((paramInt < 0) || (paramInt > size)) { throw new IndexOutOfBoundsException(outOfBoundsMsg(paramInt)); } } private String outOfBoundsMsg(int paramInt) { return "Index: " + paramInt + ", Size: " + size; } private Object[] growIfNeeded() { if (enableCapacity <= this.size) { enableCapacity = enableCapacity * 2; Object[] largerElementData = new Object[enableCapacity]; System.arraycopy(elementData, 0, largerElementData, 0, elementData.length); elementData = largerElementData; } return elementData; } public static void main(String[] args) { ArrayList list = new ArrayList(); for (int i = 0; i <= 11; i++) { list.add(String.valueOf(i)); } System.out.println(list.get(11)); //list.add(10,"test"); //list.get(10); //list.remove(10); //System.out.println(list); } }