package com.coding.basic;
import java.util.Arrays;
/**
* @author Hipple
* @Time:2017年2月20日 下午8:53:31
* @version 1.0
*/
public class ArrayList implements List {
//元素数量
private int size = 0;
//默认容量
private final int defaultCapacity = 10;
//存储元素的容器
private static Object[] elementData;
//无参构造器
public ArrayList(){
elementData = new Object[defaultCapacity];
}
//指定容量的构造器
public ArrayList(int capacity){
if (capacity < 0) {
//非法参数
throw new IllegalArgumentException("Illegal Capacity: "+ capacity);
}
elementData = new Object[capacity];
}
//添加元素
public boolean add(Object o){
ensureCapacityInternal(size + 1);
elementData[size++] = o;
return true;
}
//添加元素到指定位置
public void add(int index, Object o){
rangeCheck(index);
//将当前位置及后续元素后移一位
ensureCapacityInternal(size + 1);
System.arraycopy(elementData, index, elementData, index+1, size-index);
elementData[index] = o;
size++;
}
//根据下表获取值
public Object get(int index){
rangeCheck(index);
return elementData[index];
}
//删除元素
public Object remove(int index){
rangeCheck(index);
Object oldValue = elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0) {
//要删除的元素不是最后一个时,将当前元素及后续元素左移一位
System.arraycopy(elementData, index+1, elementData, index, numMoved);
}
elementData[--size] = null;//自动回收
return oldValue;
}
//删除元素
public boolean remove(Object o) {
// 由于ArrayList中允许存放null,因此下面通过两种情况来分别处理。
if (o == null) {
for (int index = 0; index < size; index++){
if (elementData[index] == null) {
fastRemove(index);
return true;
}
}
} else {
for (int index = 0; index < size; index++){
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
}
return false;
}
//返回现有元素数量
public int size(){
return size;
}
//是否为空
public boolean isEmpty(){
return size == 0;
}
//迭代器
public Iterator iterator(){
return new ArrayListIterator(this);
}
//动态增加ArrayList大小
private void ensureCapacityInternal(int minCapacity) {
//当前数组无法再存放时将数组长度增加至原长度的1.5倍
if (minCapacity - elementData.length > 0) {
int newCapacity = (elementData.length * 3)/2;
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
//检查是否下标越界
private void rangeCheck(int index){
if (index < 0 || index > this.size) {
throw new IndexOutOfBoundsException("Index: "+index+", Size: "+size);
}
}
//删除元素,与remove的 差别就是没有下标检查
private void fastRemove(int index) {
int numMoved = size - index - 1;
if (numMoved > 0){
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
}
elementData[--size] = null;
}
private class ArrayListIterator implements Iterator{
private ArrayList list = null;
private int cursor = 0;
private int lastRet = -1;
public ArrayListIterator(ArrayList list){
this.list = list;
}
@Override
public boolean hasNext() {
return cursor != list.size;
}
@Override
public Object next() {
lastRet = cursor;
Object o = list.get(lastRet);
cursor ++;
return o;
}
@Override
public void remove() {
list.remove(lastRet);
cursor = lastRet;
lastRet = -1;
}
}
}
class testArrayList{
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
for (int i = 0; i < 10; i++) {
arrayList.add(i+1);
}
arrayList.add(5,15);
arrayList.remove(11);
Iterator it = arrayList.iterator();
while(it.hasNext()) {
Integer o = (Integer)it.next();
if(o == 8){
it.remove();
}
}
for (int i = 0; i < arrayList.size(); i++) {
System.out.println("value is "+arrayList.get(i));
}
}
}